Haskellの小技集1
忘れがちだけど、覚えていると役に立つHaskell小技集です。
リストから数を引く
リストの要素に適当な数を足すのは(+ 1)
のように部分適用を使えばよいですが、 (- 1)
は部分適用と判定されないので、以下のように書きます。
ls = map (subtract 1) [1,2,3]
実行結果
ls ==> [0,1,2]
ついsubtract
関数を忘れてしまいますよね。スペルも。。
特定のコンストラクタを持つ値だけ取り出す
data Temperature = C Int | F Int
ts = [C 1, F 13, C 12, F 43, F 12, C 11]
celsius = [a | C a <- ts]
実行結果
celsius ==> [1,12,11]
catMaybes
とかもこれを使って定義されてるんですね。
(-> a) がApplicativeな件
(-> Bool)
がApplicativeのインスタンスであることを利用して、リストls :: [a]
から 述語p1, p2 :: a -> Bool
の少なくとも一方を満たす要素だけ取り出したりできます。
例えば、String
から“大文字または数値”である要素を取り出すコードは以下のように書けます:
import Control.Applicative
import Data.Char (isUpper, isDigit)
aa = filter (liftA2 (||) isUpper isDigit) "dsUOIJfa8eOIJee49r8u389f"
実行結果
aa ==> "UOIJ8OIJ498389"
もちろん、(||)
を(&&)
に変えれば連言もいけます。