gpt4 book ai didi

haskell - 如何让 Haskell 中的函数使用一种数据类型返回多个类型?

转载 作者:行者123 更新时间:2023-12-01 22:20:39 25 4
gpt4 key购买 nike

所以在我的代码中,我将数据类型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com