我是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
对的F#语法为T1 * T2
,您可以使用fst
函数(或使用模式匹配)获取第一个元素,因此代码的语法有效版本如下所示:
type Person = int * int
type Address = Person * string * int
let getPerson (n:Address) : Person =
fst n
看看F#的乐趣和获利-这是一个很棒的F#源代码,您可以在其中找到所有语法。
另外,请注意,F#中的类型别名实际上只是别名-因此编译器不会区分Person
和int * int
。这也意味着您可能会在IntelliSense中看到它们两者。如果您想更强地区分它们,我建议您使用记录或区分大小写的联合(这样,该类型实际上就是一个不同的类型)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句