将String列表转换为Int列表

时间:2009-05-28 09:16:05

标签: haskell functional-programming casting

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

["1","2"] -> [1,2]

3 个答案:

答案 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'中定义