Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过haskell函数传递参数时出错_Haskell - Fatal编程技术网

通过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
中执行未经修改的操作即可。