F#简单签名

时间:2015-11-03 04:40:59

标签: f#

我发现了类似的东西,但不完全是我正在寻找的东西

为什么

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

感谢您的澄清。

1 个答案:

答案 0 :(得分:4)

好的,我会告诉你第一个,然后你可以查看其他的。

请注意{j}}这意味着f x是一个函数(对于某些f'a -> 'b始终具有签名'a

现在'bx的参数,它必须与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并将其结果返回fmatch(其中,正如我们所见,有返回类型merge

您现在看到,'b必须有f类型,如果您汇总了f : 'a -> 'b -> 'b

的类型,您将再次完成

边注

还记得我声称每个功能都有某些类型的签名merge,现在我写的是'a -> 'b之类的内容吗?

如果您将最后一个读作'a -> 'b -> 'b,这当然就是我们所说的currying,这确实是一致的:如果您只需要返回函数,那么您不需要具有多个参数的函数只要你不深入研究产生的IL,就应该想到F#正是这样做的;)

我想你会自己管理最后一个 - 尝试一下,如果你有问题编辑你的问题以表明你的问题,我们会帮忙;)