名前
- 五十嵐 雄 (Twitter: @yu_i9 / GitHub: @yu-i9)
所属
- 京大情報学科計算機科学コース3回生
- CAMPHOR- 副代表
興味
- 型システム
flatten :: [[a]] -> [a]
flatten = concat
def flatten(l):
result = []
for item in l:
if isinstance(item, list):
result.extend(flatten(item))
else:
result.append(item)
return result
flatten :: ??
flatten :: [[a]] -> [a]
flatten :: [[[a]]] -> [a]
flatten :: [[[[a]]]] -> [a]
...
これを一般化する道具が簡単には用意できない
[[a]], [[[a]]], [[[[a]]]], ...
つまり「リスト」という性質を持った
型の集合を表現する方法を考える
型クラス
class Flatten i o where
flatten :: [i] -> [o]
instance Flatten a a where
flatten = id
instance Flatten i o => Flatten [i] o where
flatten = concatMap flatten
Prelude> flatten [[[1,2,3]]] :: [Int]
この時点で以下のような型は分かる
flatten :: [[[Int]]] -> [Int]
これにインスタンスをあてはめてみると
instance Flatten [Int] Int => Flatten [[Int]] Int where
flatten :: [[[Int]]] -> [Int]
flatten = concatMap flatten
Prelude> flatten [[1,2,3]] :: [Int]
次のインスタンスは以下のように続く
instance Flatten Int Int => Flatten [Int] Int where
flatten :: [[Int]] -> [Int]
flatten = concatMap flatten
concatMap で リストのネストが浅くなる
instance Flatten Int Int where
flatten :: [Int] -> [Int]
flatten = id
class Flatten i o where
flatten :: [i] -> [o]
Flatten [[[Int]]] Int → Flatten Int Int
型クラスは異なる型に対して共通の
インターフェースを定義するだけでなく,
型の再帰的な構造を表現するなど
たくさんの可能性を秘めている.
Is there a function to flatten a nested list of elements?
http://stackoverflow.com/questions/5994051/is-there-a-function-to-flatten-a-nested-list-of-elements
flatten :: [[a]] -> [a]
flatten = concat
flatten2 :: [[[a]]] -> [a]
flatten2 = concatMap concat
flatten3 :: [[[[a]]]] -> [a]
flatten3 = concatMap flatten2
flatten4 :: [[[[[a]]]]] -> [a]
flatten4 = concatMap flatten3