数字の文字列をread使って数字列に変換する
2015-09-22
QiitaHaskellやり方
read . return
を使って型を指定すれば良い
Prelude> let n = "123456789" :: String
Prelude> n
"123456789"
Prelude> map return n :: [String]
["1","2","3","4","5","6","7","8","9"]
Prelude> map (read . return) n :: [Int]
[1,2,3,4,5,6,7,8,9]
Prelude> map (read . return) n :: [Float]
[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]
[String]
の場合には以下のようにmap
してあげれば良い
Prelude> let parse str = map (read . return) str :: [Int]
Prelude> :t parse
parse :: [Char] -> [Int]
Prelude> map parse ["1234","5678","9012"]
[[1,2,3,4],[5,6,7,8],[9,0,1,2]]
Prelude> map product $ map parse ["1234","5678","9012"]
[24,1680,0]
ちょっと詳しく
大事なのはこの型指定
Prelude> map (read . return) n :: [Int]
return
をリスト(モナド)への変換操作として用いており、
さらにread
の返り値としてInt
を同時に指定している
分解するとこうなる
Prelude> let x = return "100" :: [String]
Prelude> x
["100"]
Prelude> map read x :: [Int]
[100]
当然リスト以外を使うことも出来て、
例えば文字列をMaybe Int
に変換したければfmap
を使って以下のように書ける
Prelude> fmap read $ return "100" :: Maybe Int
Just 100
Prelude> let x = return "100" :: Maybe String
Prelude> fmap read x :: Maybe Int
Just 100
使えるシーン
from: https://qiita.com/petitviolet/items/8bc8b7f5aa3a343d4228