0

この質問で示されたものと同様の問題で、「ジェネリック」タイプ a の Haskell 式を持つことは可能ですか? 何かのようなもの、

myExpression :: a

私はHaskellを初めて使用しますが、これまで見てきたことから、これを達成することはできません。

4

3 に答える 3

7

いいえ、底以外にそれを満たすものはありません。

myExpression = myExpression

-- or,

myExpression = undefined

それが可能になる合理的な方法はありますか?and 型の両方である下以外Integerの式Maybe (String -> IO ())(たとえば)。


さらに、あなたが言及した質問をa -> a考えると、その1つの答えは、型シグネチャを持つ唯一の非底関数が でidあることを証明しましたa。もしあったなら、

f _ = myExpression

は type を持つことができますがa -> a、これはidボトムでもなく、矛盾しています。

于 2012-09-01T21:36:25.440 に答える
1

その型シグネチャは、「すべての型aに対して、 myExpression は型aです」と読むことができます。つまり、myExpression はすべての型に存在する何らかの値でなければなりません。

数学的に言えば、aは「アナグマ」または「アナグマではないもの」である可能性があるため、そのような値は存在せず、これら 2 つのセットは必然的に区別されます。

Haskell の型システムでは、 myExpression が取る唯一の有効な値はundefined、つまり下です。

于 2012-09-02T05:38:35.737 に答える
1

抽象的には「a」型を持つ値は 1 つだけですが、実行時にはさまざまな解釈が可能です。

myExpression = myExpression

これは決して終了しません。

myExpression = undefined

これは (GHC を使用している場合) " * Exception: Prelude.undefined"を出力します。

myExpression = error "Hello!

これにより、「* Exception: Hello!」が出力されます。

myExpression = unsafePerformIO (launchNukes >> fail "BOOM")

このバージョンの bottom の動作は、インポートしたライブラリによって異なります。

「ジェネリック」タイプについて尋ねるので、任意の値を有効に含めることができるタイプを意味する場合があります。その場合は、Data.Dynamicを見てください。これにより、メモリ内表現を持つものを「Dynamic」型の値に変換できます。後で「Dynamic」型の値を使用するときに、実際に何か役に立つことができる、より具体的な型に変換することを試みることができます。

于 2012-09-02T07:21:07.267 に答える