如何在elm中的case语句中获取字符串的值

Pra*_*jot 1 elm

考虑以下.为什么它不起作用.我怎么能让它发挥作用?

type IntOrString
  = String
  | Int

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

    Int ->
      toString intOrString
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 6

您的IntOrString类型声明似乎表明您需要一个可以包含整数或字符串的类型.但是,这不是你创造的.我建议阅读"榆树指南"中关于联合类型部分.

声明联合类型时,必须创建构造函数.在你的榜样,你实际上是创建具有两个构造函数,这两者都不包含一个参数,所以虽然你给他们打电话类型IntString,他们舍不得榆木的原生没有关系IntString类型.在这种情况下,它们可以被认为大致相当于C#或Java等语言中的枚举.

此外,您的声明会导致编译器混淆,因为您创建了与现有类型冲突的构造函数名称,因此在您的代码中,编译器会在您说出Int或表示您的意思时将其混淆String.

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

type IntOrString
  = MyString String
  | MyInt Int
Run Code Online (Sandbox Code Playgroud)

现在,您可以getInt根据新定义调整功能.请注意如何使用模式匹配从字符串中取出字符串或整数值,具体IntOrString取决于使用哪个构造函数创建它:

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

    MyInt i ->
      toString i
Run Code Online (Sandbox Code Playgroud)