【问题标题】:Can you give functions specific type signatures in F#?你能在 F# 中给函数特定的类型签名吗?
【发布时间】:2018-03-24 22:29:03
【问题描述】:

您好,我已经开始学习 F#,我想知道您是否可以限制函数的输入和输出的类型。

我试过这样做:

main : unit
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
let _ = main

我还尝试将let 放在第一行的main 之前。都没有奏效。有没有办法在 F# 中做这种事情?我认为这是 Haskell 的一个不错的功能。

【问题讨论】:

    标签: types f#


    【解决方案1】:

    输入和输出受到约束,但是它们受到隐式约束,例如以下代码。

    let add1int arg = number+1
    let add1double arg = number+1.0
    

    函数 add1int 接受一个 int 并返回一个 int。编译器知道这一点,因为 arg 的值被添加到另一个 int 中。同样,add1double 接受一个双精度并返回一个双精度。

    但是,如果您想显式声明您的输入和输出类型,而不是将其留给编译器处理(这可以在某些地方增加可读性)。

    let add1int (number:int):int = number+1
    let add1double (number:double):double = number+1.0
    

    【讨论】:

    • 只是为了给不熟悉F#语法的OP澄清一下语法,每个参数的类型声明都需要括号括起来,不带括号的类型声明(最多可以有一个)声明函数返回值的类型。例如,let f (x : int) : string 声明了 int -> string 类型的函数,let g (c : char) (n : int) : string 声明了 char -> int -> string 类型的函数。
    【解决方案2】:

    是的,这是完全可能的:

    let main : unit = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
    

    还有几点:

    首先,你可以使用printfn,而不是最后的\n

    其次,lambda 表达式中的x 是多余的,lambda 表达式本身也是如此。要对多个调用进行排序,您可以简单地按顺序列出它们,每个都在新行上(或用分号分隔):

    let main : unit =
        printfn "Hello World"
        printfn "Goodbye World"
    

    第三,这样你定义的不是一个函数,而是一个。 F# 与 Haskell 不同,它不是惰性求值的,因此该定义的整个主体将在其作用域开始时执行一次,而不是每次调用它。如果你想定义一个函数,给它一些参数。如果您没有任何有意义的参数可以提供,请将其设为单个 unit 值:

    let main () : unit =
        printfn "Hello World"
        printfn "Goodbye World"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      相关资源
      最近更新 更多