我有一个任务来定义两个函数,一个具有类型:
('a-> 'b) -> ('c -> 'a) -> 'c -> 'b
Run Code Online (Sandbox Code Playgroud)
第二个只有
'a -> 'b
Run Code Online (Sandbox Code Playgroud)
而第一个功能是组合,我已经这样做了:
let compose f g arg = f(g(arg))
Run Code Online (Sandbox Code Playgroud)
我被困在第二个。谁能引导我正确答案?我做了这个:
let a x = List.hd []
Run Code Online (Sandbox Code Playgroud)
但我很确定有更简单的例子。
第一个函数不是柯里化,它是函数组合。咖喱有类型('a * 'b -> 'c) -> 'a -> 'b -> 'c。
您的解决方案'a -> 'b非常好。请注意,List.hd []会引发异常。所以另一个实现是:
let f x = raise Not_found
Run Code Online (Sandbox Code Playgroud)
需要意识到的是,没有“好的”函数可能具有给定的类型。它会从哪里获得'b要返回的类型的实际值?它必须是一个可以具有任何类型的值。