作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以在我的代码中,我将数据类型 Token 声明为:
data Token = Char | Int
deriving (Show,Eq,Ord)
和声明为 readIfNumber 的函数
readIfNumber :: Char -> Token
readIfNumber a
| isDigit a = Token (digitToInt a)
| otherwise = Token a
但是当我尝试编译时,根据我对 Token 的声明,当 Int 应被视为 Token 时,控制台返回“expecting type Token, but got Char”或“expecting Token, but got Int”错误.我在这里做错了什么?
最佳答案
在变体类型中,您始终需要明确选择您选择的选项。 IE。您需要使用构造函数 明确地“标记”这两个分支。喜欢,
data Token = CharToken Char | IntToken Int
当实际从 char 或 int 构建 token 时,您将其包装在合适的构造函数中:
readIfNumber a
| isDigit a = IntToken $ digitToInt a
| otherwise = CharToken a
这是必需的原因?好吧,Haskell 有完整的 type erasure ,即类型在编译时被完全跟踪、决定和优化。在运行时,您不知道包含的类型是 char 还是 int。有时这没关系,即当您有多态 Action 时。例如,length
实际上并不关心列表中包含的元素 的类型,因为它只处理结构列表。
然而,在这种情况下,接收到 Token
的人 将 需要知道它是 char 还是 int,以便进一步正确处理它。因此需要标记包含哪种类型。
关于haskell - 如何让 Haskell 中的函数使用一种数据类型返回多个类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332869/
我是一名优秀的程序员,十分优秀!