gpt4 book ai didi

f# - 类型别名和函数签名 F#

转载 作者:行者123 更新时间:2023-12-01 04:43:34 25 4
gpt4 key购买 nike

我是 F# 语言的新手,我的专业背景主要是 C#/SharePoint,最近我参加了 Haskell 类(class),这是一种可爱的函数式语言。

我的问题是关于类型别名(同义词)和函数签名的使用,在 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) -> String -> int -> String -> (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# for Fun and Profit - 这是一个很棒的 F# 源代码,您可以在那里找到所有语法。

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

关于f# - 类型别名和函数签名 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19639366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com