我很难理解Haskell中的Currying。我无法理解这个主题已经存在的答案。我想了解之间的区别:
(Int -> Int) -> Int
和
Int -> (Int - > Int)
我认为答案与currying有关。我已经咨询过有关该主题的一些资源,我有一个想法。
具有多个参数的函数可以描述为具有一个输入和一个输出的基本操作数组。
根据在线教程learnyouahaskell:
“首先执行max 4 5创建一个函数,该函数接受一个参数并返回4或该参数,具体取决于哪个更大。然后,5将应用于该函数,该函数将产生我们想要的结果。”
因此,在这种情况下,基本的基本操作只是比较两个值。第一个操作是
如果“可能的最低值”> 4
则“可能的最低值”,否则为4
第二个操作是
如果4> 5然后4否则5
这代表Int -> (Int -> Int)
,但(Int -> Int) -> Int
会是什么?
答案 0 :(得分:2)
Int -> (Int -> Int)
与
的类型相同Int -> Int -> Int
是一个curried双参数函数的类型,都是整数。也就是说,它是一个带整数参数并返回一个函数的函数,该函数的参数是另一个整数,最后返回一个整数。
可能的来电是f 3 2
和f (7+4) (5*8)
。
可能的定义是f a b = a+b
和f a b = a*a+42*b
。
相反,
(Int -> Int) - > Int
不是二元函数,咖喱与否。它是一个带有单个参数的函数,该参数是函数 Int -> Int
。最终结果是整数。
可能的来电是f (\x -> x+1)
,f id
和f g where g n = n*4+5
。
可能的定义是f h = h 45
和f h = h (h 6) + h 7 + 9
。
答案 1 :(得分:0)
部分功能应用的想法是Haskell的标志。 利用部分应用是很自然的。这是我们的思考方式。 我用玻璃杯装满了茶。然后我用柠檬酸完全填充它。
m2 = max 4
- 部分申请(Int - > Int)
m2 5
- 完整申请(Int - > Int) - > INT
Haskell中的所有函数都是curry。有时需要使用uncurry
m3 = uncurry max
m4 = m3 4
- 未成为(Int - > Int)
m4 3
- 不是(Int - > Int) - > Int - > INT
不起作用且错误与部分应用程序(Int - > Int)有关,因为该函数现在需要两个参数。