我有一个字符串列表,是否可以将其转换为整数列表?
E.g:
["1","2"] -> [1,2]
答案 0 :(得分:42)
好吧
f :: [String] -> [Int]
f = map read
没有
答案 1 :(得分:28)
这失败了:
map read ["1","2"]
[*Exception: Prelude.read: no parse
这样做的方法是:
map (read::String->Int) ["1","2"]
[1,2]
:: [Int]
在GHCI之外,在.hs文件中,它将是:
let intList = map (read::String->Int) ["1","2"]
答案 2 :(得分:4)
此类问题的一般答案是将任务分成几部分:[String] -> [Int]
看起来像String -> Int
和[a] -> [b]
的组合。 Hoogle(链接)会给你两个结果,让我们看看...
呃,很多垃圾。我们可以先消除那些与你无关的包裹......$ hoogle'字符串 - > INT'
Test.HUnit.Base Label :: String - >节点
前奏错误:: [Char] - >一个
前奏长度:: [a] - >诠释
Data.List length :: [a] - >诠释
Data.Char digitToInt :: Char - >诠释
Data.Char ord :: Char - >诠释
Debug.Trace trace :: String - > a - >一个
Network.BufferType buf_fromStr :: BufferOp a - >字符串 - >一个
Network.Socket send :: Socket - >字符串 - > IO Int
Graphics.UI.GLUT.Callbacks.Window Char :: Char - >重点
前奏阅读::阅读a =>字符串 - >一个
Text.Read read :: Read a =>字符串 - >一个
Data.String fromString :: IsString a =>字符串 - >一个
GHC.Exts fromString :: IsString a =>字符串 - >一个
Control.Monad.Trans.Error strMsg :: Error a =>字符串 - >一个
Control.Monad.Error.Class strMsg :: Error a =>字符串 - >一个
...
前奏错误:: [Char] - >一个
前奏长度:: [a] - >诠释
Data.List length :: [a] - >诠释
Data.Char digitToInt :: Char - >诠释
Data.Char ord :: Char - >诠释
前奏阅读::阅读a =>字符串 - >一个
Text.Read read :: Read a =>字符串 - >一个
Data.String fromString :: IsString a =>字符串 - >一个
Text.Printf printf :: PrintfType r =>字符串 - > ř
error
听起来不像你想要的那样。 length
也没有。 digitToInt
?听起来很对 - 实际上是有效的,但只有一位数的数字。 read
?也许不是你期望的名字,但是如果你想到这是正确的事情:将字符串转换为更有意义的东西(如数字)就像阅读一些文本。
对,在另一方面,Hoogle为我们提供了我们想要的东西:
$ hoogle'[a] - >并[b]'
Prelude map ::(a - > b) - > [a] - >并[b]
Data.List map ::(a - > b) - > [a] - >并[b]
前奏concatMap ::(a - > [b]) - > [a] - >并[b]
Data.List concatMap ::(a - > [b]) - > [a] - >并[b]
Data.Maybe mapMaybe ::(a - > Maybe b) - > [a] - >并[b]
前奏周期:: [a] - >并[a]
Data.List cycle :: [a] - >并[a]
前奏init :: [a] - >并[a]
Data.List init :: [a] - >并[a]
前奏逆转:: [a] - > [α]
正如你所看到的,大多数这些函数被称为“map”,这可能不再是你所期望的名字 - 但显然这就是这个操作被调用的东西!你正在寻找的那个是最简单的。
最后,我们需要结合这两个功能。 map
需要另一个函数作为它的第一个参数 - 好吧,那显然是read
然后!因此,您只需将map
应用于read
即可。下一个参数是[a]
的列表:aha,我们已经完成了!
你可以通过启动ghci来检查这个:
前奏> :t map read
map read :: Read b => [String] - >并[b]
这里仍有b
而不是Int
,但不要紧,b
可以是您想要的任何类型! - 只要它有Read
个实例。 Int
有:
前奏> :i Int
data Int = GHC.Types.I#GHC.Prim.Int# - 在`GHC.Types'中定义
实例有界Int - 定义在`GHC.Enum'中 实例Enum Int - 在`GHC.Enum'中定义 实例Eq Int - 定义在`GHC.Classes'中 实例积分Int - 定义在`GHC.Real'
实例Num Int - 定义在`GHC.Num'中 实例Ord Int - 在“GHC.Classes”中定义 实例读取Int - 在“GHC.Read”中定义 instance Real Int - 在`GHC.Real'中定义 实例显示Int - 在`GHC.Show'中定义