任意の型の引数を無限に消費する空腹関数はHaskell(GHC)では書けないのか?
Schemeでいうと
(define (hungry x) hungry)
みたいなやつ。
ここまではできた。参考: https://github.com/jstolarek/sandbox/blob/master/haskell/Hungry.hs
Prelude> :set -XRankNTypes Prelude> data Hungry = Hungry { (%) :: forall b. b -> Hungry } Prelude> let fix f = f $ fix f Prelude> let hungry = fix id :: Hungry Prelude> :t hungry % 42 % 'c' % [] hungry % 42 % 'c' % [] :: Hungry
unHungry (上では (%)
) 無しでは書けないのかなあ。
(追記 18:38)
できた、のか?
参考:可変長引数をHaskellで。 - ここにタイトルを入力|
Prelude> class Hungry f where hungry :: a -> f Prelude> instance Hungry a => Hungry (f -> a) where hungry _ = hungry Prelude> :t hungry 42 'c' [] hungry 42 'c' [] :: Hungry t => t
型クラスにするとそれっぽいものが何故かできた。何故だ?