fugafuga.write

日々のログ

すごいH本 part28

引き続きモジュールの使用例

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, ....]

ここで実装したisInisInfixOfという関数で定義されている。

所感

型制約の付け方がよくわからんので、自分で書くとなった場合に迷いそうである。実際、今回実装を予想して書いたら、型制約が抜けてた。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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