Haskell 如何将head(xs)作为一个参数传递给另一个函数?

Haskell 如何将head(xs)作为一个参数传递给另一个函数?,haskell,arguments,Haskell,Arguments,所以我有这个函数 intCMP :: Int -> Int -> Ordering intCMP a b | a == b =EQ | a < b = LT | otherwise = GT 我试图查找有关列表的信息,但我让Trouble将元素传递到intCMP中 这就是我想做的 intCMP head(xs) 1 但这给了我一个错误,说它有太多的争论 <interactive>:2:9: error:

所以我有这个函数

intCMP :: Int -> Int -> Ordering
intCMP a b | a == b =EQ
           | a < b = LT
           | otherwise = GT
我试图查找有关列表的信息,但我让Trouble将元素传递到intCMP中

这就是我想做的

intCMP head(xs) 1
但这给了我一个错误,说它有太多的争论

<interactive>:2:9: error:
       • Couldn't match expected type ‘Int’ with actual type ‘Integer’
       • In the first argument of ‘intCMP’, namely ‘(head xs)’
         In the expression: intCMP (head xs) 1
         In an equation for ‘it’: it = intCMP (head xs) 1
:2:9:错误:
•无法将预期类型“Int”与实际类型“Integer”匹配
•在“intCMP”的第一个参数中,即“头xs”
在表达式中:intCMP(头xs)1
在“it”的方程式中:it=intCMP(头xs)1

必须以不同的方式设置括号

 intCMP (head xs) (head $ tail xs)
因为在haskell函数中,应用程序只是空白


您的表达式被解析为
intCMP head xs head(tail xs)
,这不是您想要的。

您必须以不同的方式设置括号

 intCMP (head xs) (head $ tail xs)
因为在haskell函数中,应用程序只是空白


您的表达式被解析为
intCMP head xs head(tail xs)
,这不是您想要的。

在Haskell中,通过键入函数名,然后键入每个参数来调用函数。参数之间用空格隔开

在其他语言中,特别是C的后代,可以通过在括号中传递参数来调用方法,但不能在Haskell中传递参数。括号并不表示函数调用,它们完全用于修改普通运算符的优先级

这就像在基本算术中,你有一个操作符优先级的正常顺序。例如,
1+2*3
1+(2*3)
相同,因此通常不编写后者。但是,如果您希望在乘法之前计算加法,请使用括号表示与范数的偏差:
(1+2)*3

哈斯克尔也是这样。您需要将两个值传递给
intCMP
,您可以这样做:

Prelude> intCMP (head xs) (head (tail xs))
LT

基本上,只需将括号移动一点。

在Haskell中,通过键入函数名,然后键入每个参数来调用函数。参数之间用空格隔开

在其他语言中,特别是C的后代,可以通过在括号中传递参数来调用方法,但不能在Haskell中传递参数。括号并不表示函数调用,它们完全用于修改普通运算符的优先级

这就像在基本算术中,你有一个操作符优先级的正常顺序。例如,
1+2*3
1+(2*3)
相同,因此通常不编写后者。但是,如果您希望在乘法之前计算加法,请使用括号表示与范数的偏差:
(1+2)*3

哈斯克尔也是这样。您需要将两个值传递给
intCMP
,您可以这样做:

Prelude> intCMP (head xs) (head (tail xs))
LT

基本上,您只需要将括号移动一点。

错误不在于参数太多,而是列表元素的类型是
整数,而不是预期的
Int

您有两种选择:

第一:通过允许接受所有的
Ord
(可订购)类型,使您的功能更加通用(请注意,此功能在序言中作为
compare
提供)


错误不是因为参数太多,而是列表元素的类型是
Integer
,而不是预期的
Int

您有两种选择:

第一:通过允许接受所有的
Ord
(可订购)类型,使您的功能更加通用(请注意,此功能在序言中作为
compare
提供)


你能分享运行你的程序的确切输出,以及源代码的统一视图吗?这就是我作为源代码所拥有的全部,只是定义的函数和列表。但是我会告诉你错误。在
intCMP(head xs)1
intCMP head(xs)1
之间有(或者应该有)区别。你能分享一下运行你的程序的确切输出和源代码的统一视图吗?这是我作为源代码所拥有的全部,只是定义的函数和列表。但是我将向您展示错误。
intCMP(headxs)1
intCMP head(xs)1
之间存在(或应该存在)差异。
intCMP (fromIntegral $ head intxs) 1