如何检查Haskell中的字符串是否可以解析为特定类型?

时间:2019-06-30 18:01:05

标签: haskell

所以我在haskell中定义了自己的数据类型,如下所示:

data Token = Num Double | Op String

我想创建一个将字符串列表转换为令牌列表的函数。例如

toTokenList ["2","+","3"]
> [Num 2.0, Op "+", Num 3.0]

我将如何去做?

我实现了一个将类型Double转换为Token类型的函数,以及另一个将String转换为Token类型的函数。这些可以用于toTokenList还是可以不使用?

相对而言,我是Haskell的新手,如果您需要进一步澄清这个问题,请在评论中让我知道。

提前谢谢!

1 个答案:

答案 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 amaybe :: b -> (a -> b) -> Maybe a -> b进行后备,并对值进行后处理。

例如:

Prelude Data.Maybe Text.Read> toTokenList ["2","+","3"]
[Num 2.0,Op "+",Num 3.0]