Haskell:将函数映射到列表的列表中

10

如何将一个函数映射到列表中的列表进行操作?以下只是我想要作为示例尝试的内容,但我只是一般性地提问。提前感谢!

现在,我正在尝试将一个函数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

别忘了接受你的问题的答案 =)(通过点击答案上的绿色勾号) - Johanna Larsson
你列在这里的代码是否有任何错误信息?如果有,是什么?如果没有,那么你到底在问什么?我唯一看到的错误是你使用了 width,也许你想用 length - Dan Burton
4个回答

15

看看这个!

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

等等。


@AndrewC,是的,这不是一个教学上有帮助的答案,如果我没有写下它,我可能不会喜欢它... - luqui

7

可以使用柯里化和另一个map调用。

map (map change) $ itrCol xs

要了解更多有关柯里化的内容,请查看《Learn You A Haskell》中的章节,这是一本很适合初学者的Haskell入门书。

谢谢您的回复!我对柯里化不太熟悉,但是根据我的研究,它是改变函数所需参数数量的过程? - user1670032
我读过的最好的解释是Learn You A Haskell。你真的应该读完整本书,不会有更好的了! - Johanna Larsson
1
谢谢!这是我的第一个函数式编程语言,它与我习惯的命令式语言非常不同。我一定会深入研究它! - user1670032

3

map(以及更重要的fmap)本质上是将一个函数提升到可以在列表上工作的级别,从而为您提供一个新的函数:(我添加了多余的括号以使其更清晰)

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

如果您映射第二个函数([a] -> [b]),则会得到一个可用于列表的函数:
evalChange xs = map (map change) $ itrCol xs

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


谢谢您的回复!出于某些原因,这给了我一个错误。我试图包含map函数类型,但它仍然给了我一个错误。我不确定如何在GHC中将该错误复制到这里? - user1670032
@user1670032 将其复制并粘贴为答案的编辑。如果您不知道如何操作,请截屏。 - Pubby
2
如果你在Windows上使用ghci,你需要点击左上角的图标,然后从菜单中选择“编辑 -> 标记”。现在,高亮你想要复制的内容,然后按Enter键。然后,只需像往常一样粘贴到任何你想要的地方。 - Code-Apprentice

1

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是什么:正如你在这里看到的,它们甚至可以是列表本身!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接