我想创建一个表示变量的数据类型Var。变量是a,b,c ... z,小写或大写字符。为变量表示创建数据类型,用所有字母a..z,小写或大写字母表示
我可以这样写:
data Var = A | B | C -- continues to Z
,但我不能这样写:
data Var = a | b | c -- continues to z
大概是因为他们都是小写。有没有一种优雅的方式来使这种数据类型?
我想创建一个表示变量的数据类型Var。变量是a,b,c ... z,小写或大写字符。为变量表示创建数据类型,用所有字母a..z,小写或大写字母表示
我可以这样写:
data Var = A | B | C -- continues to Z
,但我不能这样写:
data Var = a | b | c -- continues to z
大概是因为他们都是小写。有没有一种优雅的方式来使这种数据类型?
不,没有 - 正如你所说的,他们必须是大写的。
我会去与
data Var = Var_A | Var_B | ... | Var_Z
| Var_a | Var_b | ... | Var_z
或V_A | V_B
等
另一种方法是使用
newtype Var = Var Char
但失去了一些安全的,但确实是发放用于读取和显示。您必须确保在您的代码中没有无效的Char
最终成为Var
s。
(data Var_A | ...
是一个很多的样板代码,所以你可以只做A到D,然后写这些代码只是用这些字母,然后自己做一点练习来编写一个Haskell程序来编写源代码数据类型和你的解析函数!你会在Haskell中学习一些关于字符串操作的方法。)
((这里有一个模板哈斯克尔的设计,可以为你做样板工作,但这是相当先进的,你应该首先学习你的字符串操作,而且,当我谈论这个话题时,一旦你真的知道你在做什么,看看Scrap Your Boilerplate,这是一些非常先进的写技术,聪明的代码,你需要更多的Hask ELL的经验,你去,虽然之前。))
一种解决方法是只需
data Var = Var Char
虽然根据需要Var 'c'
和Var 'D'
将填充型,可惜Var '%'
可以填充它。有两种方法可以解决这个问题。一种是像你一样枚举所有构造函数:
data Var = A | B | C -- continues to Z
| SmallA | SmallB | SmallC -- continues to z
的另一种方式只让正确的值进入类型是使用smart constructors。