我发现了类似的东西,但不完全是我正在寻找的东西
为什么
let map x f = f x
返回
val map : 'a -> ('a -> 'b) -> 'b
和
let rec merge f xs a =
match xs with
| [] -> a
| y::ys -> f y (merge f ys a);;
返回
val merge : f:('a -> 'b -> 'b) -> xs:'a list -> a:'b -> 'b
和
let rec merge2 a = function
| [] -> a
| x::xs -> fold f (f a x) xs;;
返回
val merge2: f:('a -> 'b -> 'a) -> a:'a -> _arg1:'b list -> 'a
感谢您的澄清。
答案 0 :(得分:4)
好的,我会告诉你第一个,然后你可以查看其他的。
请注意{j}}这意味着f x
是一个函数(对于某些f
和'a -> 'b
始终具有签名'a
。
现在'b
是x
的参数,它必须与f
的输入具有相同的类型,我在这里命名为f
。
现在'a
的结果当然是f x
现在把它们放在一起:
'b
需要两个参数:
map
x : 'a
f : 'a -> 'b
'b
b` 这是
的参数map : 'a -> ('a -> 'b) ->
首先看一下let rec merge f xs a =
match xs with
| [] -> a
| y::ys -> f y (merge f ys a);;
的第一个案例:
match
多为xs
类型的列表:'a
xs : 'a list
,其中包含一些未知类型a
,这也是匹配的结果,因此'b
本身! 现在到第二行:
由于merge
现在有xs
类型,您必须
'a list
y : 'a
因此,您将ys : 'a list
然后'a
插入'b
并将其结果返回f
和match
(其中,正如我们所见,有返回类型merge
)
您现在看到,'b
必须有f
类型,如果您汇总了f : 'a -> 'b -> 'b
还记得我声称每个功能都有某些类型的签名merge
,现在我写的是'a -> 'b
之类的内容吗?
如果您将最后一个读作'a -> 'b -> 'b
,这当然就是我们所说的currying,这确实是一致的:如果您只需要返回函数,那么您不需要具有多个参数的函数只要你不深入研究产生的IL,就应该想到F#正是这样做的;)
我想你会自己管理最后一个 - 尝试一下,如果你有问题编辑你的问题以表明你的问题,我们会帮忙;)