2013-09-21 23 views
22

私はこのコードをHaskellでコンパイルできませんが、私の教授のシステムで動作します。私はghciバージョン7.6.2を使用します。より正確には、これは私がHaskellコード行がコンパイルされていません: "不正なデータ型コンテキスト"

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:1:6: 
Illegal datatype context (use -XDatatypeContexts): Eq a => 
Failed, modules loaded: none. 

こちらのミスは何ですが?取得していますエラーです

data Eq a => Shape a = Shape a 

ありがとうございます。

+0

[不正なデータ型のコンテキストを修正する方法](-XDatatypeContextsを使用する)?](http://stackoverflow.com/questions/22622399/how-to-fix-illegal-datatype-context-use-xdatatypecontexts ) – wizzup

答えて

31

あなたの教授はおそらく古いバージョンのGHCを使用しています。あなたが投稿した行は最近削除された機能を使用します。可能な解決策は以下のとおりです。

  1. Eq a =>を削除し、data Shape a = Shape aを書きます。

  2. GHCによれば、削除された機能を再度有効にするには、-XDatatypeContextsフラグを付けます。より詳細には

:あなたの型宣言のEq a =>一部はデータ型のコンテキストと呼ばれています。その唯一の機能は、コンストラクタのタイプを制限することで、Shape :: a -> Shape aの代わりにShape :: Eq a => a -> Shape aとなるようにします。 Shapeを含むタイプシグネチャにEq aを書く必要がなくなります。そうしなければ、そうしなければならないときにも実際に書き込む必要があります。これは、データ型の厳密なフィールドにクラス制約が必要な場合に便利でしたが、その機能は以前から削除されていました。

要するに、コンテキストを削除するだけでほぼ常にプログラムが改善されるため、Haskell 2011言語標準から削除されました。 GHC 7.0.1以降はオフにするオプションがあり、7.2.1以降はデフォルトになっています。

+0

確かにそのような制限の目的は、私が何かを書く必要がなく、私がそうしなければならない以上に書くようにして、型の安全性を正確に改善することではありませんか? – Psachnodaimonia

+0

申し訳ありませんが、タイプの安全性は、私が探している言葉ではありません。コンテキストを追加すると、プログラムの構文上の可能性と意味の意図がより緊密に結びつき、そのようにすると型チェックによって特定の意味エラーが不可能になると考えています。 – Psachnodaimonia

+0

@Psachnodaimonia:それは不合理な視点ではありませんが、この特定の機能は役立つものよりも混乱していると多くの人が思います。 –

5

私は、エラーメッセージが明らかになったと思います。あなたはそれを拡張する必要があります。

{-# LANGUAGE DatatypeContexts #-} 
data Eq a => Foo a = Foo a 

この拡張はデフォルトでオンにするために使用されるが、GHC 7.6から出発しているが、その使用はdeprecatedと考えられ、将来的に削除されます。あなたの教授が古いバージョンのghcを使用している可能性があります。

+0

毎回その行を追加するのではなく、私はそれを正確には分かりません。 'data Foo a = Foo a Eqを導出する' あなたの答えに感謝します:) – Goutham

+1

これは ' FooはEqインスタンスを持つことができます。 'Bar'が' Eq'インスタンスのない型であると仮定すると、 'Foo Bar'型を持つことはできません。一方、 'Eq'を導出すると、' Foo'のデフォルトの 'Eq'インスタンスが導出されます。 'Foo Bar'(' Bar'は 'Eq'インスタンスを持たない)型を持つことができますが、' == 'を使うことはできません。 – Satvik

3

https://stackoverflow.com/a/22622591/2008899も参照してください。「理由」を説明しています。言語の変更の後ろに、というデータ型のコンテキストを提供するGADTの例を示すと、が提供されます。

関連する問題