ViewPatterns
パターンマッチの前に関数を適用して、その結果に対してマッチするための拡張構文
多少きれいに書けるのはわかるが、わざわざ拡張を用意するほどか?という気もするmrsekut.icon
code:haskell
{-# LANGUAGE ViewPatterns #-} 例
code:haskell
f :: Int -> String
f (even -> True) = "even"
f (even -> False) = "odd"
起きていること
1. 引数に 関数even を適用
2. その結果 Boolに対してマッチ
つまり、下記と同等
code:haskell
f x = case even x of
True -> "even"
False -> "odd"
Listの末尾が0であるかを判断する関数
code:hs
endWithZero' :: Int -> Bool endWithZero' [] = False
endWithZero' (last -> 0) = True
endWithZero' _ = False
結果を変数として受け取ることもできる
code:haskell
bar :: Int -> Int
bar ((\x -> x * 2) -> y) = y + 1
code:haskell
baz :: Int -> Int
baz (abs -> a) = a
注意点
View はマッチのたびに実行される
code:hs
f :: Int -> String
f (even -> True) = "even"
f (even -> False) = "odd"
↑に対し、f 1を呼ぶとevenは2回呼ばれる