3

私は全くの初心者です。emacsを使用してLYAHを通過します。

私の現在のセットアップ:

  • Ubuntu 12.04 LTS(Use Experience-初心者)
  • GNU Emacs 23(Use Experience-初心者)
    • haskellメジャーモードで作業できる

ここで説明されているポイント2で、(haskellライブラリを持ってくるための)指示に従うのが難しいことがわかりました。

ScionIDEを有効にするためのガイダンスも必要です。

問題:

.hsコード

data Maybe a = Nothing | Just a

コードの実行中に、次のエラーが発生します。

タイプミスは無視してください。当初の投稿:

*Main> just "Haha"  

インタラクティブ>:339:1:範囲外:「ただ」

これは本当のエラーです(Tikhon Jelvisのコメントの後に追加されました):

*Main> Just "Haha"  
interactive>:341:1:  
    Ambiguous occurrence `Just'  
    It could refer to either `Main.Just',    
                             defined at /home/optimight/baby.hs:89:26  
                          or `Prelude.Just',  
                             imported from `Prelude' at /home/optimight/baby.hs:1:1  
                             (and originally defined in `Data.Maybe')  
4

1 に答える 1

11

エラーは、2つの可能なバージョンがJustあり、GHCiはどちらを選択するかを認識していないことを示しています。

すべてのHaskellプログラムは、多数の関数とデータ型を暗黙的にインポートします。これらは「前奏曲」を形成します。これらのタイプの1つはですMaybe。これは、すべてのプログラムが、定義したものとまったく同じ名前の型にすでにアクセスできることを意味します。

これは2つの方法で克服できます。最良のオプションは、異なる名前を選択することです。

data MyMaybe a = MyJust a | MyNothing

(私はあなたがそれよりも良い名前を思い付くことができると確信しています:P。)

もう1つのオプションは、プレリュードを明示的にインポートして、以下を非表示にすることMaybeです。

import Prelude hiding (Maybe (..))

プログラムの上部にあるこの行は、Haskellに、コンストラクター(および)を除い て、通常インポートするすべてのものをインポートするように指示しているだけです。MaybeJustNothing

ここで、もう1つの問題が発生します。GHCiはMaybe、プロンプトに表示する文字列にタイプの値をレンダリングする方法を認識していません。次のようなエラーが発生します。

<interactive>:1:1:
No instance for (Show (Maybe [Char]))
  arising from a use of `print'
Possible fix: add an instance declaration for (Show (Maybe [Char]))
In a stmt of an interactive GHCi command: print it

あなたがする必要があるのは、Maybe値が文字列としてどのように見えるかをコンパイラに伝えることです。幸い、これは非常に簡単です。実際、コンピューターで簡単にできます。タイプを次のように定義する場合:

data Maybe a = Just a | Nothing deriving (Show)

次に、コンパイラーがshow関数(基本的toStringに他の言語からのもの)を作成します。これで、元のステートメント(Just "Haha")が正しく機能するはずです。

また、Scionを有効にすることは、まったく別の質問です。Haskellをもっと学び、実際にある種のより大きなプロジェクトに取り組んでいるまでは、それを気にする価値はないと思います。今のところ、標準のHaskellモードで十分です。

于 2012-07-21T04:25:03.120 に答える