wkoikingのブログ

内容は主にhaskellやxyzzy関連です。

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"

もちろん、(||)(&&)に変えれば連言もいけます。