私は、this SO questionとthis 3 part seriesとespecially thisのようなページで、ADTを実数に似ていて操作する方法を読んでいます。代数データ型の代数をさらに乱用する - これはなぜ機能するのですか?
最後のリンクの「トラブル」セクションが私の目を引っ張り、記事には不可能と書かれていても、Nat
を解決しようとしました。
Nat = 1 + Nat
Nat - Nat = 1
Nat(1 - 1) = 1
Nat = 1/(1 - 1)
私はちょうど0で割ったので、これは総ナンセンスのように見えるかもしれません(とあなたが正しいかもしれない)が、あなたはそれらのリンクまたは類似のもののいずれかを読めば、あなたはそれが非常に似ていることに気づくでしょうリストの定義。
List(x) = 1/(1 - x)
だからあなたはあなたが開始式で繰り返し置換することにより得るでしょう正確に何である、Nat = List(1) = 1 + 1 + 1 + ...
のようにNATを書くことができます。また、これはHaskellで、このような自然数の定義と同等です:自然数、0 = []
とS(N) =() : N
の有効なエンコーディングは間違い
type Nat = [()]
はどれ。
私の質問はどのように私はこれから有効な結果を得たのですか?私はちょうど0で割った。始動方程式自体はほとんど矛盾であることは言うまでもありません。
このように私は何の意味があるのでしょうか?これはちょうど純粋な偶然の一致ですか、あるいはこの文脈で何らかの形で定義された0による除算ですか?
厳密に言えば、 '1!= 1 * 1'なので、' Nat = 1 + 1 * 1 + 1 * 1 * 1 + ... 'と書く方が正しいでしょう。 – chepner
@chepner理由を説明していただけますか?私がそれを理解した形で、型はsemiringを形成します。ここで '1'は' * 'のアイデンティティです。つまり、任意のxに対して 'x * 1 = 1'となります。したがって、「1」と「1 * 1」は等価です。 –
これらは同形ではありません。順序付きペア '(()、())'は '()'とは区別されます。 '(a、())::(x、())'を 'a :: x'に、またその逆に無損失で変換できるので、' x * 1 == x'です。 – chepner