如何将head(xs)作为一个参数传递给另一个函数?
所以我有这个功能如何将head(xs)作为一个参数传递给另一个函数?
intCMP :: Int -> Int -> Ordering
intCMP a b | a == b =EQ
| a < b = LT
| otherwise = GT
和定义
xs = [1,2,3]
我试图找到有关该列表的信息,但我有troouble传球元素融入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
错误不是关于具有太多参数,而是关于您的列表元素的类型是Integer
而不是预期的Int
。
你有两个选择:
第一:让你的功能比较一般允许所有Ord
(可订购)类型被接受(请注意,此功能可在前奏作为compare
)
intCMP :: (Ord a) => a -> a -> Ordering
intCMP a b | a == b =EQ
| a < b = LT
| otherwise = GT
其次,投你的列表元素的类型到一个使用fromIntegral
需要:
intCMP (fromIntegral $ head intxs) 1
必须设置括号不同
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
。
这在Haskell中是一样的。您需要两个值传递给intCMP
,你可以这样做:
Prelude> intCMP (head xs) (head (tail xs))
LT
基本上,你只需要左右移动了一下括号。
,仍然给我一个错误 – christian
@christian哪个错误?当你做什么? –
能否请您分享精确的输出运行你的程序,以及源代码的统一视图? –
这就是我所有的源代码,只是函数和定义的列表。但我会告诉你错误。 – christian
'intCMP(head xs)1'和'intCMP head(xs)1'之间存在(或者应该有所不同)。 – chepner