如何在elm

时间:2016-07-03 07:37:27

标签: elm

请考虑以下事项。为什么它不起作用。我怎么能让它发挥作用?

type IntOrString
  = String
  | Int

getInt : IntOrString -> String
getInt intOrString =
  case intOrString of
    String ->
      intOrString

    Int ->
      toString intOrString

1 个答案:

答案 0 :(得分:6)

您对IntOrString类型的声明似乎表明您需要一个可以包含整数或字符串的类型。但是,这不是你创造的。我建议您阅读“榆树指南”中的section on Union Types

声明联合类型时,必须创建构造函数。在您的示例中,您实际上是在创建一个包含两个构造函数的类型,这两个构造函数都不包含参数,因此尽管您将它们称为IntString,但它们与Elm的原生{{1}没有任何关系}和Int类型。在这种情况下,它们可以被认为大致相当于C#或Java等语言中的枚举。

此外,您的声明会导致编译器混淆,因为您创建了与现有类型冲突的构造函数名称,因此在您的代码中的其他地方,当您说StringInt时,编译器会误解您的意思

让我们重新定义类型,使它成为一个可以包含整数或字符串值的单一类型。我还将重命名构造函数以避免名称冲突。

String

现在您可以根据新定义调整type IntOrString = MyString String | MyInt Int 函数。请注意如何使用模式匹配从getInt值中提取字符串或整数值,具体取决于使用哪个构造函数创建它:

IntOrString