繁体   English   中英

Haskell Map function 实施问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM