使用类型代表函数的优点是什么?
例如,我观察了以下片段:
type Soldier = Soldier of PieceProperties
type King = King of PieceProperties
type Crown = Soldier -> King
是否只是在尚未满足其他args的情况下支持部分应用程序?
答案 0 :(得分:2)
正如Fyodor Soikin在评论中所说的那样
你给其他一切命名的理由相同 - 价值观,功能, 模块等
换句话说,考虑一下通常不使用类型的汇编编程,(是的,我知道typed assembly)和所有可能遇到的问题,然后解决了多少这些问题或通过添加类型减少。
因此,在使用支持函数但使用静态类型的语言进行编程之前,您键入了所有内容。现在您正在使用具有静态类型和函数的F#,只需扩展您使用的键入内容,但现在添加了键入函数的功能。
从"Types and Programming Languages"
引用Benjamin C. Pierce类型系统是用于证明缺席的易处理的句法方法 通过按照分类来分类短语的某些程序行为 他们计算的各种价值。
如“类型和编程语言”第1.2节中所述
什么类型的系统适合
- 检测错误
- 抽象
- 文档
- 语言安全
- 效率
TL; DR
我发现命名类型函数定义非常有价值的地方之一是我在构建解析器组合器时。在构造函数期间,我完全键入函数,以便我知道类型是什么,而不是类型推理将推断它们可能与我想要的不同。由于函数类型通常具有多个参数,因此更容易为函数类型指定名称,然后在需要的任何位置使用该名称。这也节省了时间,因为函数定义是一致的,并且避免必须调试不正确声明的函数定义;是的,我通过手工完成每种功能类型并且吸取了教训。一旦所有函数都起作用,我就会从函数中删除类型定义,但是将类型定义保留为注释,这样就可以使代码更容易理解。
使用命名类型定义的另一个好处是,在创建测试用例时,命名函数中的输入规则将确保用于测试的数据具有正确的类型。这也使得在几个月后再次使用它时,更容易理解测试数据。
另一个优点是使用函数名称可以使代码更容易理解,因为当一个刚接触代码的人看到他们第一次看到名称的一致性时。此外,如果名称有意义,那么它可以更容易理解代码。
答案 1 :(得分:1)
你必须记住,函数也是F#中的值。而且你可以像其他类型那样用它们做同样的事情。例如,您可以拥有一个返回其他函数的函数。或者你可以有一个存储功能的列表。在这些情况下,如果您明确了解函数签名,它将会有所帮助。函数类型定义将帮助您约束参数和返回类型。此外,您可能具有复杂的类型签名,类型定义将使其更具可读性。这可能有点做作,但你可以做 fun(ky)这样的事情:
type FuncX = int -> int
type FuncZ = float -> float -> float
let addxy (x:int) :FuncX = (+) x
let subxy :FuncX = (-) x
let addz (x:float) :FuncZ =
fun (x:float) -> (fun y -> x + y)
let listofFunc = [addxy 10;addxy 20; subxy 10]
如果你检查listofFunc的类型,你会看到它是FuncX list
。此外,:FuncX
指的是函数的返回类型。但我们也可以将它用作输入类型:
let compFunc (x:FuncX) (z:FuncX) =
[(x 10);(z 10)]
compFunc (addxy 10) (addxy 20)