我看了很多来源:似乎不可能在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
答案 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写两次函数名的问题。