pie*_*ier 18 haskell functional-programming casting
我有一个字符串列表,是否可以将其转换为整数列表?
例如:
["1","2"] -> [1,2]
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)
此类问题的一般答案是将任务分成几个部分:看起来像和[String] -> [Int]
的组合。Hoogle(链接)会给你一些结果,让我们看看......String -> Int
[a] -> [b]
\n\n\n$ hoogle \'String -> Int\'
\n
\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前奏错误 :: [Char] -> a
\n
\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
error
听起来不太像你想要的。length
两者都不。digitToInt
?听起来有点正确 \xe2\x80\x93 并且实际上可以工作,但仅限于单位数字。read
?也许不是您期望的名称,但如果您考虑一下,这是正确的事情:将字符串转换为更有意义的内容(例如数字)就像阅读一些文本。
是的,在另一边,胡格尔给了我们我们想要的东西:
\n\n\n\n\n$ hoogle \'[a] -> [b]\'
\n
\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]
正如您所看到的,这些函数中的大多数都被称为“map”,这可能又不是您期望的名称 \xe2\x80\x93 但显然这就是这个操作的名称!您正在寻找的那个是最简单的。
\n\n最后,我们需要将这两个函数结合起来。map
需要另一个函数作为其第一个参数 \xe2\x80\x93 好吧,那显然就是read
这样!所以您只需map
申请read
. 下一个参数是 s 列表[a]
:啊哈,我们已经完成了!
您可以通过启动 ghci 来检查:
\n\n\n\n\nPrelude> :t 地图读取
\n
\n 地图读取 :: 读取 b => [String] -> [b]
这里仍然有 thisb
而不是Int
,但不用介意:b
可以是你想要的任何类型!\xe2\x80\x93 前提是它有一个Read
实例。Int
有:
\n\nPrelude> :i Int
\n
\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\' 中定义
归档时间: |
|
查看次数: |
24067 次 |
最近记录: |