我对高阶函数有点混淆,我想做一个愚蠢的例子,看看我是否理解得很好,但我仍然无法编译而没有错误,即我想我错过了一些东西。我的基本示例如下,我创建了一个函数,它将两个数字相加,然后我创建了另一个函数,它使用我之前的函数并总结另一个数字。
Sum2 :: Double -> Double -> Double
Sum2 a b = a + b
Sum3 :: (Double -> Double -> Double) -> Double -> Double
Sum3 a b c = (Sum2 a b) + c
test1:: Double
test1 = Sum3 2.0 3.0 4.0
答案 0 :(得分:1)
毫无疑问,但我猜这个OP想要解释为什么这不起作用:
Sum3 :: (Double -> Double -> Double) -> Double -> Double
Sum3 a b c = (Sum2 a b) + c
首先,函数应该具有小写名称。其次,上面的类型是具有两个参数的函数的类型:
sum3 :: (Double -> Double -> Double) -> Double -> Double
----- first arg ------------ -2nd-- -result type-
所以,应该写一下
sum3 f a = ...
其中f
是作为第一个参数Double -> Double -> Double
传递的函数,a
是第二个参数编号。由于f
是一个带有两个参数的函数,我们需要相应地使用它,例如
sum3 f a = f a a
-- or
sum3 f a = f a 12
-- or
sum3 f a = f (a+12) (f 32 a)
我不知道你想要达到的目标,上面只是例子。
最后,名称sum3
不直观,我们应该使用别的东西。