10

リスト内のリストを操作するように関数をどのようにマップしますか?以下は私が例としてやろうとしていることですが、私は一般的な質問として質問していました。前もって感謝します!

現在、関数changeを1つのリスト(itrCol xsによって返される)の各リストにマップしようとしています。

evalChange xs = map change $ itrCol xs

ここで、itrColはリストのリストを返します。ここで、含まれている各リストは列です。

itrCol xs = [getCol x xs | x <- (take (width xs) (iterate (\x -> (x + 1)*1) 0))]

getColは、列インデックスのリストを指定して列をリストします

getCol :: Int -> [t] -> [t]

変更は次のとおりです。

change []     = []
change [x]    = [x]
change [x,y]  = [x,y]
change (x:y:z:ws) | x == y && y == z = 0 : y*(-1) : 0 : change ws
change (x:xs) =  x : change xs
4

4 に答える 4

14

これをチェックしてください!

map           :: (a -> b) ->   [a]   ->   [b]
(map.map)     :: (a -> b) ->  [[a]]  ->  [[b]]
(map.map.map) :: (a -> b) -> [[[a]]] -> [[[b]]]

于 2012-10-06T19:31:43.233 に答える
7

カリー化と別の地図の呼び出しを使用できます。

map (map change) $ itrCol xs

カリー化の詳細については、 Haskellの優れた初心者向けの本であるLearn YouAHaskellのその章を参照してください。

于 2012-10-06T19:10:01.957 に答える
3

map(そしてfmapもっと重要なことに)本質的にリストで動作する関数を持ち上げて、新しい関数を提供します:(より明確にするために余分な括弧を追加しました)

map :: (a -> b) -> ([a] -> [b])

その2番目の関数をマップする([a] -> [b])と、リストのリストで機能する関数が得られます。

evalChange xs = map (map change) $ itrCol xs

(これがあなたが望んでいたものでない場合は、明確にしてください)

于 2012-10-06T19:10:20.203 に答える
1

の型署名mapは次のとおりです。

map :: (a -> b) -> [a] -> [b]

の1つの賢明な型署名changeは次のとおりです。

change :: [Integer] -> [Integer]

ここで、最初の引数として関数fromからtoをmap期待します。、、から、へ、そしてへの関数を与えると。abchange[Integer][Integer]a = [Integer]b = [Integer]

map change :: [[Integer]] -> [[Integer]]

iterCol xsここで、供給から生成されたリスト内包表記があれば[[Integer]]、それを次のように適用できますmap change

map change (itrCol xs) :: [[Integer]]

これはすべて私にはうまく見えます。map多形であるため動作します。AをBに変換する関数を指定すると、AのリストをBのリストに変換する関数が返されます。AとBが何であるかは関係ありません。ここでわかるように、それらはリスト自体である可能性もあります。

于 2012-10-06T22:44:24.727 に答える