beautiful people

data Person = Person {
    isBeautiful :: Bool
  , isNice      :: Bool
  , isTall      :: Bool
  } deriving Show

type People = [Person]

people :: People
people = let b = [minBound ..] in Person <$> b <*> b <*> b

beautiful :: People -> People
beautiful = filter isBeautiful

nice :: People -> People
nice = filter isNice

tall :: People -> People
tall = filter isTall

main :: IO ()
main = do
    print $ beautiful people
    print $ (beautiful . nice) people
    print $ (beautiful . nice . tall) people

これはなに

職場で Rails の scope の名前を決める際のアドバイスとして,形容詞の限定用法について話していて,引数として述語を与えた filter 関数がまさにそれに当たるのではと思い付いたので書いてみた.

逆に isBeautiful は叙述用法だろうか. 叙述用法に関して言えば,isBeautiful のような疑問文は Person -> Bool 型の関数として解釈できるけれども,Alice is beautiful. のような平叙文は,命題(あるいは内容が真であることが保証できる場合には定理)として捉えられるだろうから,もっと型レベルプログラミングでごにょごにょできそうな匂いもする. (ぼくはその道の人ではないので,formulae-as-types なんかについては詳しく知らないのだけれども.)