在Haskell中将Data.Text转换为Int

Ral*_*lph 23 string haskell type-conversion

另一个问题中,其中一条评论说," [Data.]Text正在成为事实上的文本实现.String由于遗留原因和简单的事情仍然存在,但对于你应该使用的严肃的文本操作Text."

将a转换为a的最简单方法Data.TextInt什么?read将无法正常工作,因为该read功能总是需要一个String.

我能想到的最好的是:

let fortyTwo = Data.Text.pack "42"
read $ Data.Text.unpack fortyTwo :: Int
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

sha*_*haf 20

看一下这个text,我看到一个名为的模块Data.Text.Read.它似乎工作:

?> decimal (T.pack "99 bottles")
Right (99," bottles")
?> decimal (T.pack "a digit")
Left "input does not start with a digit"
Run Code Online (Sandbox Code Playgroud)

  • 好吧,无论如何,对于`read`的大多数用途,你必须处理它.如果它看到一个格式错误的字符串,那么`read`会崩溃你的程序,这非常糟糕(如果它的类型是`Read a => a - > Maybe String`可能会更好).如果您确定要使程序崩溃,可以随时定义`foo f = fst.要么是错误ID.f`,然后使用`foo decimal`而不是`decimal`. (5认同)
  • 就我而言,我知道**字符串是一个数字; 它来自正则表达式匹配(`"\ d {2}"`). (2认同)

Tho*_*son 14

换句话说,您需要一个可以使用的解析器Text.hackage上有很多可以使用Text的解析器,我建议你试试attoparsec.

import Data.Attoparsec.Text
parseInt = parseOnly (signed decimal)
Run Code Online (Sandbox Code Playgroud)