15

Haskell の表示セマンティクスに関するこの記事によると、Int から Int への非正格 (非最下位保存) 関数は 1 つだけです。

引用する:

Integer -> Integer 型の厳密ではない関数のプロトタイプが 1 つしかない場合があります。

1 x = 1

そのバリアントは、具体的な数値 k ごとに constk x = k です。なぜこれらだけが可能なのですか?1 つの n は1 つの ⊥ よりも少なく定義できないことに注意してください。Integer はフラットなドメインであるため、両方が等しくなければなりません。

本質的に、その型シグネチャの唯一の非正格関数は定数関数のみであると言います。私はこの議論には従いません。また、フラットなドメインが何を意味するのかよくわかりません。この記事の残りの部分では、値のポーズセットにノードが 1 つしかないことを単に意味していると信じるようになります。

A->A、または A->B からの関数で同様のことが起こりますか? つまり、それらは定数関数でなければなりませんか?

4

2 に答える 2

17

一部の定数用Integerではない関数は、その引数を検査する必要があります。を部分的に検査することはできません。const kkIntegerかもしれないそれが「フラットドメイン」であることの意味です。これはInteger、Haskell 仕様で のセマンティクスがどのように定義されているかの結果であり、コア言語のセマンティクスに従うものではありません。

対照的に、 type の無限に多くの厳密でない関数がすべてのtypeに対して[a] -> [a]存在します。atake1

take1 (x:_) = [x]

非厳密性を示すには、次のように定義します

ones = 1 : ones

表示のセマンティクスに関しては、[[ ones]] = ⊥ です。しかしtake1 onesは に評価される[1]ので、take1厳密ではありません。take2 (x:y:_) = [x,y]take10なども同様です。

整数に対して非厳密で非定数の関数が必要な場合は、 とは異なる整数の表現が必要ですInteger。たとえば、次のようになります。

data Bit = Zero | One
newtype BinaryInt = I [Bit]

のリストをI「リトル エンディアン」の 2 進整数として解釈すると、関数は

mod2 (I [])       =  I []
mod2 (I (lsb:_))  =  I [lsb]

非厳密です。

于 2013-01-10T16:17:16.457 に答える
16
于 2013-01-10T16:20:12.517 に答える