3

我是一个尝试学习haskell的新手,我试图在其他论坛中搜索类似的东西,但找不到类似的问题。

addPoly :: (Num a)=>[[a]]->[a]
addPoly  x = map sum $ transpose x

运行良好

但是当我最后删除 x 时,它会出错

addPoly :: (Num a)=>[[a]]->[a]
addPoly  = map sum $ transpose 

错误说:

Couldn't match expected type `[[Integer]] -> [Integer]'
            with actual type `[Integer]'
In the expression: map sum $ transpose
In an equation for `addPoly': addPoly = map sum $ transpose

Couldn't match expected type `[[Integer]]'
            with actual type `[[a0]] -> [[a0]]'
In the second argument of `($)', namely `transpose'
In the expression: map sum $ transpose
In an equation for `addPoly': addPoly = map sum $ transpose

无法弄清楚我在这里缺少什么。

免责声明:这不是作业问题

4

2 回答 2

7

$在 Haskell 中定义为

f $ x = f x
infixr 0 $

因此,如果您扩展代码的第一个片段,

map sum $ transpose x

变成

map sum (transpose x)

这将起作用。

但是第二个片段

map sum $ transpose 

变成

map sum transpose

当你用 调用它时x,你会得到

map sum transpose x

实际上 map 已经sum结束transpose(并使用参数调用结果x,这也没有意义,并导致您收到错误消息,因为map将返回 a List,而不是函数),而不是 over transpose x

您需要为此使用该.函数,而不是$,它被定义为

(.) f g = \x -> f (g x)

如果你这样做,你的代码

map sum . transpose

变成

\x -> map sum (transpose x)

当你从某个参数调用x它时,它就变成了

map sum (transpose x)

这是我们开始使用的(正确的)代码。

如果有不清楚的地方,请告诉我。

于 2013-09-25T13:53:28.117 回答
1

正确的代码是:

addPoly :: (Num a)=>[[a]]->[a]
addPoly  = map sum . transpose 

如何到达它?请记住以下两条规则:

f $ x = f x
f. g $ x == (f.g) x == f (g x) == f $ g x

因此,

addPoly  x = map sum $ transpose x

被改写为

addPoly  x = map sum $ transpose $ x

然后$除最后一个之外的每个都替换为..

addPoly  x = map sum . transpose $ x

现在,由于您只有一个$并且参数仅在右侧,$您可以切换到无点样式

于 2013-09-25T13:40:12.933 回答