2012-02-13 13 views
12

voidパッケージには、次のように定義されてVoidと呼ばれる住めないタイプを、提供すると主張 -Data.Voidを定義するための不要なタイプのジャグリング(Hackageのパッケージ "void")?

newtype Void = Void Void 

方法は、この定義には、シンプルなものを使用するよりも任意の良いですか?私の理解が正しい場合、両方のデータ型に下限値のみが含まれています。しかし後者ははるかに理解しやすいです。

EDIT:私は以下のダニエルの答えを理解しています。しかし、私はHaskell98との互換性を保ちながらこれを行うためのもっと簡単な方法を考えました。抽象データ型を使用して、コンストラクタをユーザーに公開することはできません。

module Data.Void (Void) where 
    data Void = Void 

今Data.Voidモジュール内のコードのみがボイドを構築することができ、しかし、我々はそれません知っているので、ボイドのデータ型が効果的に無人です。

私はここで何か不足していますか?

+0

"Data.Voidモジュールのコードでは、1つのモジュールが多すぎるVoidを作成できます。 – PyRulez

+0

さて、ええ、私は今、[Carlのコメント](http://stackoverflow.com/questions/9261490/unnecessary-type-juggling-to-define-data-void-package-void-on-hackage)を読んだ後で理解しています。 ?noredirect = 1#comment11678217_9261699):) –

答えて

15

Hackageのvoidパッケージの説明から: "A Haskell 98論理的に無人のデータ型"(私の強調)。 Voidを単にdata Voidと宣言すると、Haskell 2010または "EmptyDataDecls"言語拡張が必要となるため、 "Haskell 98"にはなりません。まさにこのような状況を説明しHaskellのWikiに

EDIT

Here is a page

absurd :: Void -> a 

ボイドは、あなたが不条理機能を必要とする理由であるHaskellでは最初のオブジェクトであると想定している:あなたは不条理な機能を持っていないので、

+0

偉大なので、私は自分の定義を使用することができますhaskell98の互換性は私にとって重要ではない場合。ありがとう! –

+0

Haskell98でこれを行うもう1つの可能な(そしてより単純な)方法を追加しました。あなたはそれをどう思いますか? –

+2

@AnupamJainこれは簡単ではなく、正しいものでもありません。ボイドパッケージが存在する唯一の理由は、唯一の可能な住人としてボトムを持つタイプを持つことです。コンストラクタのエクスポートに失敗しても、コンストラクタは存在しません。新しいタイプの配合は、底部のみがそのタイプに生息できることを証明する。これはモジュールのタイプチェックなどで不合理な機能を作るために重要です。 – Carl

6

あなたの実装はまだ不完全です。私は、ボイドパッケージ内の不条理の実装は非常にエレガントかつ適切であることを見つける:

absurd (Void a) = absurd a 

この定義は、任意の結論を導き出すことができ、そこから偽前提にボイドの論理的なアナロジーを彷彿とさせます。それは、それ自体を証明するための論理的な誤りを使用しています。論理的には不条理です。

関連する問題