0

私は次のリストを持っています

Prelude> let a = [["1676","17348","10"],["1677","18831","10"],["1677","18896","10"]]

このようにIntのリストのリストに変換したい[[1676,17348,10],[1677,18831,10],[1677,18896,10]]

次のコードを試しましたが、機能しません。

f :: [[String]] -> [[Int]]
f [x] = map read (map read x)
4

2 に答える 2

3

なぜmap (map read)機能するのか。

内部(map read)署名は[String] -> [Int]です。したがって、のリストをのリストに変換しStringますInt。これで、のリストのリストに適用するにはString、を使用して上げるだけmapでよいので、map(map read)機能します。これでは、のリスト(または、それがより良い場合は、のリストの(map read)リスト)の各要素に関数を適用しています。の型アノテーションはですので、持つ ことはできません。あなたの外側の型の署名はそうです、そしてそれはどのように機能するかではありません。[String]String
map read (map read)readString -> Intread(mapread(map read))[String]->[Int]read

于 2012-12-31T09:01:39.697 に答える
2

レンズライブラリ(Control.Lens)を使用した代替ソリューション3.7.1.2

import Control.Lens
f :: [[String]] -> [[Int]]
f = over (traverse.traverse) read

今、代わりに私たちが持っていた場合:

Prelude> let a = [("1676","17348"),("1677","18831"),("1677","18896")]

f :: [[String]] -> [(Int, Int)]
f = over (traverse.both) read

または、3つのタプルの場合、両方の定義から拡張して、新しい関数を3回必要とします。

Prelude> let a = [("1676","17348","10"),("1677","18831","10"),("1677","18896","10")]

import Control.Lens
import Control.Applicative

thrice f ~(a, a', a'') = (,,) <$> f a, <*> f a' <*> f a''

f :: [[String]] -> [(Int, Int, Int)]
f = over (traverse.thrice) read
于 2013-01-02T23:58:12.730 に答える