引き続きモジュールの使用例
2つのリストを受け取り、1つめのリストが2つめのリストに含まれているかどうかを調べる関数を実装してゆく。
以下の関数を使う
Data.List.tails
リストを受け取り、tails
を繰り返し適用する
*Main Data.List> tails "yahooooooooo" ["yahooooooooo","ahooooooooo","hooooooooo","ooooooooo","oooooooo","ooooooo","oooooo","ooooo","oooo","ooo","oo","o",""] *Main Data.List> tails [1,2,2,3,4,5,6] [[1,2,2,3,4,5,6],[2,2,3,4,5,6],[2,3,4,5,6],[3,4,5,6],[4,5,6],[5,6],[6],[]]
Data.List.isPrefixOf
2つのリストをとり、2つめのリストが1つめのリストで始まっているかチェックする
*Main Data.List> "foo" `isPrefixOf` "f" False *Main Data.List> "foo" `isPrefixOf` "foooooo" True
Data.List.any
こんなの
*Main Data.List> any (>3) [1,2,3,4,5] True *Main Data.List> any (>3) [1,2] False
組み合わせる
import Data.List isIn :: (Eq a) => [a] -> [a] -> Bool needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
実行結果
*Main Data.List> [6] `isIn` [1,2,3,4,5,6] True *Main Data.List> [7] `isIn` [1,2,3,4,5,6] False *Main Data.List> "ooo" `isIn` "yahoooooooo" True *Main Data.List> "ooo" `isIn` "yaho" False
こうすると型が違うのでエラーになる
*Main Data.List> 6 `isIn` [1,2,3,4,5,6] <interactive>:36:1: error: • No instance for (Num [a0]) arising from the literal ‘6’ • In the first argument of ‘isIn’, namely ‘6’ In the expression: 6 `isIn` [1, 2, 3, 4, ....] In an equation for ‘it’: it = 6 `isIn` [1, 2, 3, ....]
ここで実装したisIn
はisInfixOf
という関数で定義されている。
所感
型制約の付け方がよくわからんので、自分で書くとなった場合に迷いそうである。実際、今回実装を予想して書いたら、型制約が抜けてた。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る