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

如何将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 
+0

能否请您分享精确的输出运行你的程序,以及源代码的统一视图? –

+0

这就是我所有的源代码,只是函数和定义的列表。但我会告诉你错误。 – christian

+0

'intCMP(head xs)1'和'intCMP head(xs)1'之间存在(或者应该有所不同)。 – chepner

错误不是关于具有太多参数,而是关于您的列表元素的类型是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 * 31 + (2 * 3)相同,所以通常不写后者。但是,如果您希望在乘法之前对加法进行评估,则可以使用括号来表示与标准的偏差:(1 + 2) * 3

这在Haskell中是一样的。您需要两个值传递给intCMP,你可以这样做:

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

基本上,你只需要左右移动了一下括号。

+0

,仍然给我一个错误 – christian

+1

@christian哪个错误?当你做什么? –