F#Type声明可能ala Haskell?

时间:2010-09-14 21:58:14

标签: haskell f#

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

' haskell type def:
myFunc :: int -> int

我想在F#中使用这种类型的def风格 - FSI很高兴回应我:

fsi> let myType x = x +1;;

val myType : int -> int

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

//invalid F#
myFunc : int -> int
myFunc x = x*2

6 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:19)

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

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

// Test.fs
let myFunx x = x + 1

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

答案 2 :(得分:1)

您可以在F#中执行此操作,以指定myType的返回值。

let myType x : int = x + 1

您也可以指定参数的类型。

let myType (x : int) : int = x + 1

希望这有帮助!

答案 3 :(得分:1)

另请参阅The Basic Syntax of F# - Types(在“类型注释”下讨论这方面的内容。)

答案 4 :(得分:1)

另一种选择是使用"类型缩写" (http://msdn.microsoft.com/en-us/library/dd233246.aspx

type myType = int -> int
let (myFunc : myType) = (fun x -> x*2)

答案 5 :(得分:-1)

是的,你可以使用lambda函数

myFunc : int -> int =
  fun x -> x*2

这也避免了haskell写两次函数名的问题。