请考虑以下事项。为什么它不起作用。我怎么能让它发挥作用?
type IntOrString
= String
| Int
getInt : IntOrString -> String
getInt intOrString =
case intOrString of
String ->
intOrString
Int ->
toString intOrString
答案 0 :(得分:6)
您对IntOrString
类型的声明似乎表明您需要一个可以包含整数或字符串的类型。但是,这不是你创造的。我建议您阅读“榆树指南”中的section on Union Types。
声明联合类型时,必须创建构造函数。在您的示例中,您实际上是在创建一个包含两个构造函数的类型,这两个构造函数都不包含参数,因此尽管您将它们称为Int
和String
,但它们与Elm的原生{{1}没有任何关系}和Int
类型。在这种情况下,它们可以被认为大致相当于C#或Java等语言中的枚举。
此外,您的声明会导致编译器混淆,因为您创建了与现有类型冲突的构造函数名称,因此在您的代码中的其他地方,当您说String
或Int
时,编译器会误解您的意思
让我们重新定义类型,使它成为一个可以包含整数或字符串值的单一类型。我还将重命名构造函数以避免名称冲突。
String
现在您可以根据新定义调整type IntOrString
= MyString String
| MyInt Int
函数。请注意如何使用模式匹配从getInt
值中提取字符串或整数值,具体取决于使用哪个构造函数创建它:
IntOrString