【问题标题】:F# function arguments type annotation not workingF# 函数参数类型注释不起作用
【发布时间】:2017-09-26 17:22:47
【问题描述】:

我希望 F# 函数中的参数具有特定类型:

type NewType = string*int

let testFunction (arg1:NewType) : NewType =
  ("resultString", 2)

testFunction ("test", 3)

我希望函数的类型是:

NewType -> NewType

但是函数类型是:

string*int -> NewType

我应该怎么做才能强制参数 arg1 的类型为“NewType”?

【问题讨论】:

    标签: function f# arguments type-annotation


    【解决方案1】:

    type NewType = string * int 是所谓的类型缩写。它为另一种类型提供名称或别名,但在编译过程中会被删除。没有封装,没有新的引用,基本没有新的类型。

    它可以用作文档,但 F# 的编译器将新名称和别名类型视为相同。如果您使用使用 NewType 的公共函数/方法创建 DLL 并尝试从另一个项目调用它,则这一点尤其明显 - 您将看到与您的情况类似的混合结果。

    如果您想要实现的只是更好的可读性,这可能不是问题。如果我在代码中看到let testFunction (arg1:NewType) : NewType = ...,尤其是在没有 IntelliSense 工具提示的 GitHub 上的 Web 上,这仍然让我很好地了解函数接受和返回的内容,即使实践中的“真实”类型是 @ 987654326@.

    如果您想要更好的类型安全性,通常的做法是定义一个单案例区分联合,您可以将其与模式匹配结合起来,如下所示:

    type NewType = NewType of (string * int)
    
    let testFunction (NewType arg1): NewType =
        NewType ("resultString", 2)
    
    testFunction (NewType ("test", 3))
    

    您可以在此处以及该系列的其他文章中阅读更多内容:https://fsharpforfunandprofit.com/posts/type-abbreviations/

    【讨论】:

    • 但是为什么返回类型是“NewType”,为什么它与返回类型一起工作而不是与参数一起工作。顺便感谢您的链接!
    • @FraK,这是一个好问题,除了:这就是当前版本的编译器决定这样做之外,我不知道一个令人满意的答案(来源例如:github.com/fsharp/fsharp/issues/717) .正如 Tomas 所说,原始类型及其别名对于编译器(和其他工具)是可互换的,并且它不保证您何时会看到其中一个。
    • 感谢您的回答
    【解决方案2】:

    NewType 的类型声明是一个类型别名,这意味着 NewType 可以与 string * int 交换 - 编译器将它们视为同一事物,有时这意味着它会报告一个代替另一个,尽管有类型注释。

    如果您想要一个始终必须通过其全名引用的类型,您需要将其定义为显式的新类型 - 此时,最好使用记录(这也可以让您命名各个字段),但如果你想要一些简洁的东西,你可以使用单例区分联合:

    type NewType = NT of (string*int)
    
    let testFunction (NT arg1) : NewType =
      NT("resultString", 2)
    
    testFunction (NT("test", 3))
    

    【讨论】:

    • 但是为什么返回类型总是有效,它是“NewType”而不是字符串*int?
    • @FraK 我认为这只是编译器中某些实现细节的副作用 - 当统一两种类型 t1t2 时,编译器会检查它们是否相等 - 然后选择并使用其中之一作为它显示的类型名称。
    • 感谢您的回答
    猜你喜欢
    • 2017-10-02
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多