LoginSignup
1
0

More than 5 years have passed since last update.

Haskellでチャーチ数 - うまくいかない版

Last updated at Posted at 2015-09-19

Haskellでチャーチ数

あとで説明をつける予定

はじめに

これは単純だけどうまく動かない版だ。Lispは型なしラムダ計算を背景にしているのに対して、Haskellは型付きラムダ計算を背景にしている。型推論の際に型が無限ループになってしまう。まずこの版を見てから「うまく動く版」を見ると理解しやすいだろう。

整数との相互変換

churchNaive.hs
toInt n = n (+ 1) 0
toChurch 0 = zero
toChurch n = s . toChurch $ n - 1

ブール値と条件分岐

churchNaive.hs
false x y = y
true x y = x
_if b x y = b x y

churchNaive.hs
zero f x = x
s n f x = f $ n f x
one = s zero
two = s one
three = s two
four = s three
five = s four
six = s five

数の演算

churchNaive.hs
add m n f x = m f $ n f x
mul m n f = m $ n f
pre n f x = n (\g h -> h $ g f) (\u -> x) (\u -> u)

述語

churchNaive.hs
isZero n = n (\x -> false) true

型の不一致

問題ない例

churchNaive.hs
zeroToOne n = _if (isZero n) one zero

型の不一致

churchNaive.hs
zeroToOne' n = _if (isZero n) one n
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0