F#Type声明可能ala Haskell?

Kev*_*Won 26 f# haskell

我看了很多来源:似乎不可能在F#ala Haskell中声明一个类型定义:

' haskell type def:
myFunc :: int -> int
Run Code Online (Sandbox Code Playgroud)

我想在F#中使用这种类型的def风格 - FSI很乐意回复我:

fsi> let myType x = x +1;;

val myType : int -> int
Run Code Online (Sandbox Code Playgroud)

我想在Haskell中明确说明F#中的类型def签名.有没有办法做到这一点?我想用F#写:

//invalid F#
myFunc : int -> int
myFunc x = x*2
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 24

通常的方法是做let myFunc (x:int):int = x+1.

如果你想更接近haskell风格,你也可以这样做let myFunc : int -> int = fun x -> x+1.


Tom*_*cek 20

如果要将可读类型声明与实现分开,可以使用"fsi"文件(F#签名文件).'fsi'只包含类型,通常还包含注释 - 您可以在F#库的源代码中看到一些很好的示例.您将创建两个这样的文件:

// Test.fsi
val myFunc : int -> int

// Test.fs
let myFunx x = x + 1
Run Code Online (Sandbox Code Playgroud)

这适用于已编译的项目,但您无法使用F#Interactive轻松使用此方法.

  • @Kevin:我不太确定,但我同意Haskell方式看起来比混合标题/类型注释更具可读性.这可能是OCaml的传统,因为我不认为这有任何技术问题.将它们内联写入是有意义的...(另一个问题是,此时是否值得限制F#团队资源) (3认同)
  • 谢谢托马斯.只是为了记录,F#团队,非常好吗?在线时间注释? (2认同)
  • 另请注意.fsi是在.fs之后检查的,因此您可能仍需要在.fs中使用某些类型注释来使类型推理器满意. (2认同)