通过haskell函数传递参数时出错
我收到一个错误,不知道为什么通过haskell函数传递参数时出错,haskell,Haskell,我收到一个错误,不知道为什么 mapo :: ((Float, Float) -> Float) -> [(Float, Float)] -> [Float] mapo f [] = [] mapo f (x:y) = f x : mapo f y 编译ok *Main> mapo + [(1,2)] Couldn't match type `(Float, Float) -> (Float, Float)' with `Float' Expected type
mapo :: ((Float, Float) -> Float) -> [(Float, Float)] -> [Float]
mapo f [] = []
mapo f (x:y) = f x : mapo f y
编译ok
*Main> mapo + [(1,2)]
Couldn't match type `(Float, Float) -> (Float, Float)' with `Float'
Expected type: (Float, Float) -> Float
Actual type: (Float, Float) -> (Float, Float) -> (Float, Float)
In the first argument of `mapo', namely `(+)'
In the expression: mapo (+) [(1, 2)]
In an equation for `it': it = mapo (+) [(1, 2)]
此函数的目的是接收一个运算符(比如
+
或-
),一个数对列表(Float
),并返回使用该运算符和列表中每对参数的结果。您的问题仅仅是语法错误;如果要部分应用运算符,则需要将其括在括号中;所以不是
mapo + [(1,2)]
写
否则它将解析为将mapo
添加到[(1,2)]
(即(+)mapo[(1,2)]
,这显然不是您想要的
下一件事是正确选择类型:
(+)::Float->Float->Float
(在您的例子中,它的实际类型更通用)-但您的函数需要(Float,Float)->Float
。这两种类型并不相等,但它们表达的内容几乎相同,因此您可以使用curry::((a,b)->c)->a->b->c
和uncurry::(a->b->c)->(a,b)->c
函数。在这种情况下,您需要将uncurry(+)
传递给mapo
函数。您的问题仅仅是语法错误;当您想部分应用运算符时,您需要将其括在括号中,而不是
mapo + [(1,2)]
写
否则它将解析为将mapo
添加到[(1,2)]
(即(+)mapo[(1,2)]
,这显然不是您想要的
下一件事是正确选择类型:
(+)::Float->Float->Float
(在您的例子中,它的实际类型更通用)-但您的函数需要(Float,Float)->Float
。这两种类型并不相等,但它们表达的内容几乎相同,因此您可以使用curry::((a,b)->c)->a->b->c
和uncurry::(a->b->c)->(a,b)->c
函数。在这种情况下,您需要将uncurry(+)
传递给mapo
函数。(+)
没有类型(Float,Float)->Float
,但是uncurry(+)
有:
mapo (uncurry (+)) [(1,2)]
-> [3]
(+)
没有类型(Float,Float)->Float
,但是uncurry(+)
有:
mapo (uncurry (+)) [(1,2)]
-> [3]
您的问题是mapo需要一个tuple(Float,Float)
的函数,但加法是两个Float
上的函数,而不是一个tuple
*Main> :t (+)
(+) :: Num a => a -> a -> a
您可以按原样使用mapo
,只要记住向它传递一个函数,该函数期望(Float,Float)
,并返回Float
您的问题是mapo需要一个tuple(Float,Float)
的函数,但加法是两个Float
上的函数,而不是一个tuple
*Main> :t (+)
(+) :: Num a => a -> a -> a
您可以按原样使用
mapo
,只要您记得向它传递一个函数,该函数期望(Float,Float)
,并返回Float请更改问题的标题。“我做错了什么?”不要告诉任何人你问题的内容。你是对的,我更改了。请更改你问题的标题。“我做错了什么?”没有告诉任何人关于你问题的内容。你是对的,我更改了它。不会。这就是答案的第二部分。谢谢@Cubic!另一个问题。假设我不习惯使用uncurry,我可以更改函数…如果我将其更改为mapo::(Float->Float->Float)->[(Float,Float)]->[Float]
我在编译时收到一个错误。你会怎么做?只要在mapo
中做uncurry就行了。不会的。这就是答案的第二部分。谢谢@Cubic!另一个问题。假设我不习惯使用uncurry,我可以更改函数…如果我将其更改为mapo::(Float->Float->Float)->[(Float,Float)]->[Float]
我在编译时收到一个错误。你会怎么做?只需在mapo
中执行未经修改的操作即可。