【问题标题】:How do i check if a string can be parsed to a certain type in Haskell?如何检查字符串是否可以在 Haskell 中解析为某种类型?
【发布时间】:2019-06-30 18:01:05
【问题描述】:

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

data Token = Num Double | Op String

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

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

我该怎么做呢?

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

相对而言,我是 Haskell 的新手,如果您需要进一步澄清这个问题,请在 cmets 中告诉我。

【问题讨论】:

  • 提示:尝试使用map
  • 我想我需要将toToken 之类的函数映射到字符串列表,但是我如何制作一个可以接收String 并给出所需@987654331 的通用函数@元素同时检查该字符串是否可以转换为Double
  • 如果有办法检查String 是否可以转换为Double 类型,我想我的问题可以解决......
  • 是的,有readMaybe
  • @RobinZigmond 非常感谢! readMaybe 工作!

标签: haskell


【解决方案1】:

我们可以实现一个乐观的算法,它首先旨在将其解析为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 =&gt; String -&gt; Maybe amaybe :: b -&gt; (a -&gt; b) -&gt; Maybe a -&gt; b 来提供后备和后处理值。

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 2012-08-16
    • 2011-09-28
    • 1970-01-01
    • 2012-08-31
    • 2013-02-05
    • 2017-06-25
    • 2013-05-26
    相关资源
    最近更新 更多