输入别名和函数签名F#

时间:2013-10-28 15:52:55

标签: f#

我是F#语言的新手,我的专业背景主要是C#/ SharePoint,最近我去了Haskell课程,这是一门可爱的功能语言。

我的问题是关于类型别名(同义词)和函数签名的使用,在Haskell中是这样做的好方法:

type Person = (String,Int)
type Address = (Person, String,Int)

getPerson :: Address -> Person
getPerson n = first n ...

当我在F#尝试过同样的事情时,我有点失败:

type Person = (int,int)
type Address = (Person, String, Int)

let getPerson (n:Address) =
    n.first ...

我做错了什么?或者,当我使用签名(int,int)函数时,提高可读性的最佳做法是什么 - >字符串 - > int - >字符串 - > (int,int)?


下面的解决方案等同于上面提到的Haskell类型同义词:

type Person = int*int
type Address = Person * string * int

let first (n,_,_) = n

let getPerson (n:Address) : Person =
    first n

1 个答案:

答案 0 :(得分:6)

对的F#语法是T1 * T2,您可以使用fst函数(或使用模式匹配)获取第一个元素,因此代码的语法有效版本如下所示:

type Person = int * int
type Address = Person * string * int

let getPerson (n:Address) : Person =
    fst n

看一下F# for Fun and Profit - 它是一个很棒的F#源,你可以在那里找到所有的语法。

除此之外,请注意F#中的类型别名实际上只是别名 - 因此编译器不区分Personint * int。这也意味着您可能会在IntelliSense中看到它们。如果你想更强烈地区分它们,我建议使用记录或单例区分联合(这样类型实际上是一种不同的类型)。