[英]Haskell Map function implementation issues
我刚开始学习 Haskell 并且在调整语言方面遇到了麻烦,例如在尝试执行类似于下面示例中的操作时更具体地说是在map
的实现上;
rotate :: Dimensions -> imgBlock -> [(imgBlock,Int)]
rotate d ((p, pix), s, t)
= zip [((p, f pix), s, t) | f <- transformate (fst d)] [0..7]
makeAllRotations :: Dimensions -> [imgBlock] -> [(imgBlock,Int)]
makeAllRotations d ib = map concat (rotate d ib) //Error points Here
在哪里
type imgBlock = (Block, Int, Int)
type Block = (Pnt, Pxl)
type Dimensions = (Int, Int)
这是我得到的错误之一
asdf.hs:73:30:
Couldn't match expected type `(imgBlock, Int)'
with actual type `[a0]'
Expected type: [[a0]] -> (imgBlock, Int)
Actual type: [[a0]] -> [a0]
In the first argument of `map', namely `concat'
In the expression: map concat (rotate d ib)
我发现自己在尝试适应这种新的编程“范式”时感到非常沮丧,在这种范式中,我设法做的大部分事情都是通过反复试验完成的。 我显然没有正确理解map
,虽然我已经阅读了本网站上的文档,但是所有示例都显示在控制台中,例如map (2+) [1,2,3]
在函数中使用它们时并没有那么多。
我能否得到一些关于我在map
实现中哪里出错的指示。 谢谢
找出问题的最好方法是查看类型:
rotate :: Dimensions -> ImgBlock -> [(ImgBlock,Int)]
makeAllRotations :: Dimensions -> [ImgBlock] -> [(ImgBlock,Int)]
map :: (a -> b) -> [a] -> [b]
concat :: [[a]] -> [a]
map function 正在尝试对旋转返回的列表中的每个 (ImgBlock,Int) 对调用 concat。 但是 concat 期望得到一个嵌套列表作为它的参数。 但帮助我弄清楚如何解决它的重要事情是查看rotate d ib
。 要旋转的第二个参数是 ImgBlock,但在那个上下文中是 ib:: [ImgBlock]。 当需要单个项目时,您不能传入列表。 但这就是 map function 的用途。 它允许您使用接受单个项目(上面类型签名中的“a”)的 function 并在您拥有 [a] 时使用该 function。 我怀疑你想要的是这样的:
makeAllRotations d ib = concat $ map (rotate d) ib
因为旋转返回一个列表, map (rotate d) ib
返回一个列表列表,它非常适合作为 concat function 的第一个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.