【问题标题】:Haskell: Map function onto a list of listsHaskell:将函数映射到列表列表
【发布时间】:2012-09-27 14:14:24
【问题描述】:

如何映射函数以对列表中的列表进行操作? 以下只是我试图做的一个例子,但我只是作为一个一般性问题提出。提前致谢!

现在,我正在尝试将一个函数 change 映射到一个列表的每个列表(由 itrCol xs 返回)。

evalChange xs = map change $ itrCol xs

itrCol 返回一个列表列表,其中每个包含列表都是一列。

itrCol xs = [getCol x xs | x <- (take (width xs) (iterate (\x -> (x + 1)*1) 0))]

getCol 列出列给定的列索引列表

getCol :: Int -> [t] -> [t]

变化是:

change []     = []
change [x]    = [x]
change [x,y]  = [x,y]
change (x:y:z:ws) | x == y && y == z = 0 : y*(-1) : 0 : change ws
change (x:xs) =  x : change xs

【问题讨论】:

  • 不要忘记接受您问题的答案 =)(点击答案上的绿色复选图标)
  • 您在此处列出的代码是否给您任何错误消息?如果是这样,它们是什么?如果不是,那你到底在问什么?我看到的唯一错误是您使用了width,而您的意思可能是length

标签: list function haskell map


【解决方案1】:

可以只使用柯里化和另一个地图调用。

map (map change) $ itrCol xs

要了解有关柯里化的更多信息,请查看 chapter in Learn You A Haskell,这是一本很棒的 Haskell 初学者书籍。

【讨论】:

  • 感谢您的回复!我是 currying 的新手,但根据我的研究,它正在改变函数采用的参数数量?
  • 我读过的最好的解释是Learn You A Haskell。你真的应该读完这本书,找不到更好的了!
  • 谢谢!这是我的第一个函数式编程语言,它与我习惯的命令式语言完全不同。我一定会调查的!
【解决方案2】:

map(更重要的是fmap)本质上提升了一个函数来处理列表,为您提供了一个新函数:(我添加了多余的括号以使其更清晰)

map :: (a -> b) -> ([a] -> [b])

如果您映射第二个函数([a] -&gt; [b]),您将获得一个适用于列表列表的函数:

evalChange xs = map (map change) $ itrCol xs

(如果这不是您想要的,请澄清)

【讨论】:

  • 感谢您的回复!出于某种原因,这给了我一个错误。我试图包含 map 的函数类型,但它仍然给我一个错误。我不确定如何将 GHC 中的错误复制到这里?
  • @user1670032 复制并粘贴它作为对您答案的编辑。如果你不知道怎么截图。
  • @user1670032 如果您在 Windows 中使用 ghci,您需要单击左上角的图标,然后从菜单中选择“编辑 -> 标记”。现在突出显示您要复制的内容,然后按 Enter。从那里,像往常一样粘贴到任何你想要的地方。
【解决方案3】:

看看这个!

map           :: (a -> b) ->   [a]   ->   [b]
(map.map)     :: (a -> b) ->  [[a]]  ->  [[b]]
(map.map.map) :: (a -> b) -> [[[a]]] -> [[[b]]]

等等

【讨论】:

  • @AndrewC,是的,这不是一个对教学有帮助的答案,如果我没有写它,我可能不会非常喜欢它......
【解决方案4】:

map 的类型签名是:

map :: (a -> b) -> [a] -> [b]

change 的一个合理类型签名是:

change :: [Integer] -> [Integer]

现在map 需要一个从ab 的函数作为它的第一个参数。如果我们给它change,一个从[Integer][Integer]的函数,然后是a = [Integer]b = [Integer]

map change :: [[Integer]] -> [[Integer]]

现在,如果从 iterCol xs 生成的列表推导提供了 [[Integer]],那么我们可以将其应用于 map change

map change (itrCol xs) :: [[Integer]]

我觉得这一切都很好。它之所以有效,是因为map 是多态的。如果你给它一个把 A 变成 B 的函数,那么它会给你一个把 A 的列表 变成 B 的列表 的函数。 A 和 B 是什么无关紧要:正如您在此处看到的,它们甚至可以是列表本身!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多