gpt4 book ai didi

haskell - Haskell Map函数实现问题

转载 作者:行者123 更新时间:2023-12-02 10:41:18 27 4
gpt4 key购买 nike

我刚刚开始学习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)

我发现自己很难适应这种新的编程“范式”,因为我设法做的大部分事情都是通过反复试验。尽管我已经阅读了有关 website的文档,但显然我无法正确理解 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函数正在尝试对Rotate返回的列表中的每个(ImgBlock,Int)对调用concat。但是concat希望将嵌套列表作为其参数。但是帮助我弄清楚如何解决它的最大事情是查看 rotate d ib。旋转的第二个参数是ImgBlock,但在这种情况下,ib::[ImgBlock]。如果需要单个项目,则无法传递列表。但这就是map函数的作用。它允许您采用接受单个项目的函数(上述类型签名中的“a”),并在有[a]时使用该函数。我怀疑您想要的是这样的东西:
makeAllRotations d ib = concat $ map (rotate d) ib

因为rotate返回一个列表,所以 map (rotate d) ib返回一个列表列表,该列表非常适合concat函数的第一个参数。

关于haskell - Haskell Map函数实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5809246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com