将String列表转换为Int列表

pie*_*ier 18 haskell functional-programming casting

我有一个字符串列表,是否可以将其转换为整数列表?
例如:

["1","2"] -> [1,2]
Run Code Online (Sandbox Code Playgroud)

ala*_*mar 44

f :: [String] -> [Int]
f = map read
Run Code Online (Sandbox Code Playgroud)

没有?


Lux*_*pes 30

这失败了:

map read ["1","2"]
[*Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)

做到这一点的方法是:

 map (read::String->Int) ["1","2"]
 [1,2]
 :: [Int]
Run Code Online (Sandbox Code Playgroud)

在GHCI之外,在.hs文件中它将是:

let intList = map (read::String->Int) ["1","2"]
Run Code Online (Sandbox Code Playgroud)

  • 我知道我的对话有点晚了,但这也可以这样做:`map read ["1", "2"] :: [Int]` (2认同)

lef*_*out 5

此类问题的一般答案是将任务分成几个部分:看起来像和[String] -> [Int]的组合。Hoogle(链接)会给你一些结果,让我们看看......String -> Int[a] -> [b]

\n\n
\n

$ hoogle \'String -> Int\'
\n Test.HUnit.Base Label :: String -> Node
\n 前奏错误 :: [Char] -> a
\n 前奏长度 :: [a] -> Int
\n Data.List 长度 :: [a] -> Int
\n Data.Char digitalToInt :: Char -> Int
\n Data.Char ord :: Char -> Int
\n Debug.Trace 跟踪 :: String -> a -> a
\n Network.BufferType buf_fromStr :: BufferOp a -> String -> a
\n Network.Socket send :: Socket -> String -> IO Int
\n Graphics.UI.GLUT.Callbacks.Window Char :: Char ->键
\n Prelude read :: Read a => String -> a
\n Text.Read read :: Read a => String -> a
\n Data.String fromString :: IsString a => String -> a
\n GHC .Exts fromString :: IsString a => String -> a
\n Control.Monad.Trans.Error strMsg :: Error a => String -> a
\n Control.Monad.Error.Class strMsg :: Error a => String -> 一个
\n ...

\n
\n\n

呃,废话很多。我们可以首先从与您无关的包裹中删除那些...

\n\n
\n

前奏错误 :: [Char] -> a
\n 前奏长度 :: [a] -> Int
\n Data.List 长度 :: [a] -> Int
\n Data.Char digitalToInt :: Char -> Int
\n Data.Char ord :: Char -> Int
\n Prelude read :: Read a => String -> a
\n Text.Read read :: Read a => String -> a
\n Data.String fromString :: IsString a => 字符串 -> a
\n Text.Printf printf :: PrintfType r => 字符串 -> r

\n
\n\n

error听起来不太像你想要的。length两者都不。digitToInt?听起来有点正确 \xe2\x80\x93 并且实际上可以工作,但仅限于单位数字。read?也许不是您期望的名称,但如果您考虑一下,这是正确的事情:将字符串转换为更有意义的内容(例如数字)就像阅读一些文本。

\n\n

是的,在另一边,胡格尔给了我们我们想要的东西:

\n\n
\n

$ hoogle \'[a] -> [b]\'
\n Prelude 映射 :: (a -> b) -> [a] -> [b]
\n Data.List 映射 :: (a -> b) -> [a] -> [b]
\n 前奏 concatMap :: (a -> [b]) -> [a] -> [b]
\n Data.List concatMap :: (a -> [b]) -> [a] -> [b]
\n Data.Maybe mapMaybe :: (a -> Maybe b) -> [a] -> [b]
\n 前奏循环 :: [a] -> [a]
\ n Data.List 循环 :: [a] -> [a]
\n Prelude init :: [a] -> [a]
\n Data.List init :: [a] -> [a]
\n Prelude 反转 : : [a] -> [a]

\n
\n\n

正如您所看到的,这些函数中的大多数都被称为“map”,这可能又不是您期望的名称 \xe2\x80\x93 但显然这就是这个操作的名称!您正在寻找的那个是最简单的。

\n\n

最后,我们需要将这两个函数结合起来。map需要另一个函数作为其第一个参数 \xe2\x80\x93 好吧,那显然就是read这样!所以您只需map申请read. 下一个参数是 s 列表[a]:啊哈,我们已经完成了!

\n\n

您可以通过启动 ghci 来检查:

\n\n
\n

Prelude> :t 地图读取
\n 地图读取 :: 读取 b => [String] -> [b]

\n
\n\n

这里仍然有 thisb而不是Int,但不用介意:b可以是你想要的任何类型!\xe2\x80\x93 前提是它有一个Read实例。Int有:

\n\n
\n

Prelude> :i Int
\n data Int = GHC.Types.I# GHC.Prim.Int# -- 在 `GHC.Types\' 中定义
\n 实例 Bounded Int -- 在 `GHC.Enum\' 中定义
\n 实例Enum Int -- 在 `GHC.Enum\' 中定义
\n instance Eq Int -- 在 `GHC.Classes\' 中定义
\n instance Integral Int -- 在 `GHC.Real\' 中定义
\n instance Num Int -- 定义in `GHC.Num\'
\n instance Ord Int -- 在 `GHC.Classes\' 中定义
\n instance Read Int -- 在 `GHC.Read\' 中定义
\n instance Real Int -- 在 `GHC.Real 中定义\'
\n 实例 Show Int -- 在 `GHC.Show\' 中定义

\n
\n