输入别名和函数签名F#

输入别名和函数签名F#,f#,F#,我是F语言新手,我的专业背景主要是C/SharePoint,最近我参加了Haskell课程,这是一门可爱的函数式语言 我的问题是关于类型别名(同义词)和函数签名的使用,在Haskell中,这样做很简单: type Person = (String,Int) type Address = (Person, String,Int) getPerson :: Address -> Person getPerson n = first n ... type Person = int * int

我是F语言新手,我的专业背景主要是C/SharePoint,最近我参加了Haskell课程,这是一门可爱的函数式语言

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

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

getPerson :: Address -> Person
getPerson n = first n ...
type Person = int * int
type Address = Person * string * int

let getPerson (n:Address) : Person =
    fst n
当我在F#中尝试同样的方法时,我有点失败了:

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

let getPerson (n:Address) =
    n.first ...
我做错了什么?或者,当我使用带有签名(int,int)->String->int->String->int(int,int)的函数时,提高可读性的最佳实践是什么


以下解决方案相当于上述Haskell类型同义词:

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

let first (n,_,_) = n

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

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

getPerson :: Address -> Person
getPerson n = first n ...
type Person = int * int
type Address = Person * string * int

let getPerson (n:Address) : Person =
    fst n
看一看——这是一个很棒的F#源代码,你可以在那里找到所有语法


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

感谢您的快速回答和正确的配对语法。但这只是为了演示,主要关注的是函数签名
getPerson::Address->Person
。我可以像Haskell中那样预定义函数签名吗?@MartinBodocky您可以使用签名文件,但它们并不经常使用()。您可以向参数和结果添加注释,以使类型更显式(请参见编辑)。