F#类型'a->('a->'b)->'b

时间:2019-09-15 20:09:37

标签: f#

作为练习,我想编写一个类型为'a -> ('a -> 'b) -> 'b的F#程序。我对F#相当陌生,但我知道->是正确的关联。我提出了以下建议:

let fun1 x = x
let fun2 x fun1 = x
let fun3 x y z = x

我从Visual Studio中得到了

val fun1 : x:'a -> 'a
val fun2 : x:'a -> fun1:'b -> 'a
val fun3 : x:'a -> y:'b -> z:'c -> 'a

这是正确的(或我正在寻找的)吗? 任何输入都非常感谢,谢谢!

1 个答案:

答案 0 :(得分:3)

如果我们将您所做的工作记为显式签名和函数,则您将完成此操作。

let fun1 : 'a -> 'a =
    fun x -> x
let fun2 : 'a -> 'b -> 'a = 
    fun x fun1 -> x
let fun3 : 'a -> 'b -> 'c -> 'a = 
    fun x y z -> x

我认为您对fun2感到困惑,因为“ fun x fun1”中的“ fun1”只是第二个参数的名称,与“ let fun1:'a”中的“ fun1”无关->'a'

如果我们这样写,它可能会变得更加清晰。

let fun1 : 'a -> 'a =
    fun a -> a
let fun2 : 'a -> 'b -> 'a = 
    fun a b -> a
let fun3 : 'a -> 'b -> 'c -> 'a = 
    fun a b c -> a

如果要编写带有签名的函数

   let answer : 'a -> ('a -> 'b) -> 'b =
      fun a a2b -> ??????

a2b是类型为('a->'b)的参数的名称,即它是一个函数,其类型为'a,返回的类型为'b。 您需要填补空白。

如果头部受伤,请消除所有参数多态性,并编写具有签名的函数

let simplerProblem : int -> (int -> string) -> string 

并想象这样称呼它...

let x = simplerProblem 1 (fun i -> i.ToString())

并且您想要答案“ 1”