所以我在haskell中定义了自己的数据类型,如下所示:
data Token = Num Double | Op String
我想创建一个将字符串列表转换为令牌列表的函数。例如
toTokenList ["2","+","3"]
> [Num 2.0, Op "+", Num 3.0]
我将如何去做?
我实现了一个将类型Double
转换为Token
类型的函数,以及另一个将String
转换为Token
类型的函数。这些可以用于toTokenList
还是可以不使用?
相对而言,我是Haskell的新手,如果您需要进一步澄清这个问题,请在评论中让我知道。
提前谢谢!
答案 0 :(得分:3)
我们可以实现一种乐观的算法,它首先旨在将其解析为Double
,如果失败,我们将为该字符串返回Op
,例如:
import Text.Read(readMaybe)
toTokenList :: [String] -> [Token]
toTokenList = map (\x -> maybe (Op x) Num (readMaybe x))
或无积分:
toTokenList :: [String] -> [Token]
toTokenList = map (flip maybe Num . Op <*> readMaybe)
我们在这里使用readMaybe :: Read a => String -> Maybe a
和maybe :: b -> (a -> b) -> Maybe a -> b
进行后备,并对值进行后处理。
例如:
Prelude Data.Maybe Text.Read> toTokenList ["2","+","3"]
[Num 2.0,Op "+",Num 3.0]