考虑以下.为什么它不起作用.我怎么能让它发挥作用?
type IntOrString
= String
| Int
getInt : IntOrString -> String
getInt intOrString =
case intOrString of
String ->
intOrString
Int ->
toString intOrString
Run Code Online (Sandbox Code Playgroud)
您的IntOrString类型声明似乎表明您需要一个可以包含整数或字符串的类型.但是,这不是你创造的.我建议阅读"榆树指南"中关于联合类型的部分.
声明联合类型时,必须创建构造函数.在你的榜样,你实际上是创建具有两个构造函数,这两者都不包含一个参数,所以虽然你给他们打电话类型Int和String,他们舍不得榆木的原生没有关系Int和String类型.在这种情况下,它们可以被认为大致相当于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)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |