类型别名和函数签名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
托马斯·佩特里切克(Tomas Petricek)

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

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

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

看看F#的乐趣和获利-这是一个很棒的F#源代码,您可以在其中找到所有语法。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通用函数类型别名

来自分类Dev

Scala类型标签和类型别名

来自分类Dev

类型别名和类似类型

来自分类Dev

多态匿名函数类型别名

来自分类Dev

Scala类型别名和方法重载

来自分类Dev

类型别名和NewType之间的区别

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

用于类型和函数签名的MonoDevelop F#工具提示;它们存在吗?

来自分类Dev

如何使用类型别名定义类型构造函数

来自分类Dev

类型别名错误

来自分类常见问题

类型和类型别名之间的Elm差异?

来自分类Dev

是否可以为constexpr函数定义类型别名

来自分类Dev

TypeScript如何为通用函数创建通用类型别名?

来自分类Dev

函数中的类型别名是否可以提高 Python 性能?

来自分类Dev

类型别名与类型相同

来自分类Dev

typedef和C ++ 11类型别名之间的区别

来自分类Dev

typedef和C ++ 11类型别名之间的区别

来自分类Dev

Typeof / instanceof类型别名

来自分类Dev

std :: bind与类型别名

来自分类Dev

Rust中的类型别名

来自分类Dev

快速扩展类型别名

来自分类Dev

Scala中的类型别名

来自分类Dev

类型别名的伴随对象

来自分类Dev

条件类型别名定义

来自分类Dev

如何创建类型别名

来自分类Dev

如何检测类型别名?

来自分类Dev

键值对的TypeScript类型别名

来自分类Dev

TypeScript中的类型别名