2012-10-06 130 views
7

如何映射函数以在列表内的列表上操作? 以下是我正在试图做的一个例子,但我只是作为一个普遍问题提出问题。提前致谢!Haskell:将函数映射到列表中

现在,我试图将函数映射到一个列表的每个列表上(由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 
+0

不要忘记接受你的问题的答案=)(通过点击答案上的绿色检查图标) –

+0

你在这里列出的代码是否给你任何错误信息?如果是这样,他们是什么?如果不是,那你到底在问什么?我看到的唯一错误是,当你可能意味着'length'时,你使用了'width'? –

回答

6

可以只使用钻营和另一个调用映射。

map (map change) $ itrCol xs 

要了解更多关于柯里看看那个chapter in Learn You A Haskell,一个伟大的初学者的书哈斯克尔。

+0

感谢您的回复!我对currying很陌生,但是从我的研究来看,它正在改变函数所需的参数数量。 – user1670032

+0

我读过的最好的解释是[Learn You Haskell](http://learnyouahaskell.com/higher-order-functions#curried-functions)。你真的应该阅读这本书,不会找到更好的! –

+1

谢谢!这是我的第一个函数式编程语言,与我习惯的命令式语言完全不同。我一定会研究这个! – user1670032

2

map(和fmap更重要的)主要举起的函数,在列表中的工作,给你一个新的功能:(我加了多余的括号,以使其更清晰)

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

如果你映射的是第二个功能([a] -> [b])你会得到关于列表的列表工作的功能:

evalChange xs = map (map change) $ itrCol xs 

(如果这是不是你就想,那么请注明)

+0

谢谢你的回应!出于某种原因,这给了我一个错误。我试图包含map的函数类型,但它仍然给我一个错误。我不确定如何将GHC中的错误复制到此处? – user1670032

+0

@ user1670032将其作为编辑复制并粘贴到答案中。如果你不知道如何截图。 – Pubby

+2

@ user1670032如果您在Windows中使用ghci,您需要点击左上角的图标,然后从菜单中选择“编辑 - >标记”。现在突出显示您想要复制的内容,然后按下Enter键。从那里,只要你想要的地方照常粘贴。 –

11

看看这个!

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

+0

@AndrewC,是的,这不是一个教学有用的答案,如果我没有写出答案,我可能不会很喜欢它...... – luqui

1

map类型签名是:

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

change为一点合理的类型的签名是:

change :: [Integer] -> [Integer] 

现在mapa期望的功能b作为其第一个论点。如果我们给它change,从[Integer][Integer],然后​​和b = [Integer]的函数。

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

现在,如果从iterCol xs产生的列表中理解供应[[Integer]],那么我们就可以应用到map change

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

这一切看起来好像没什么问题。它的工作原理是因为map是多态的。如果你给它一个把A变成B的函数,那么它会给你一个函数,把列表中的A变成列表B。 A和B的含义并不重要,正如你在这里看到的,它们甚至可以是自己的列表!