作为练习,我想编写一个类型为'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
这是正确的(或我正在寻找的)吗? 任何输入都非常感谢,谢谢!
答案 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”