2017-05-05 7 views
2

私はタイプFooを持っていると私はGHCiの中でそれを使用することができるように、それShowのインスタンスにしたい:インスタンスを定義するときにあいまいなエラーが発生するのはなぜですか?

data Foo = Foo 

instance Show Foo where 
show Foo = "Foo" 

私はそれを使用しようとすると、しかし、私はあいまいな出現エラーが表示されます。

ghci> show Foo 
<interactive>:4:1: 
    Ambiguous occurrence `show' 
    It could refer to either `Main.show', defined at Foo.hs:4:1 
          or `Prelude.show', 
          imported from `Prelude' at Foo.hs:1:1 
          (and originally defined in `GHC.Show') 

なぜですか?私はちょうどtypeclassに属する関数を定義しました、そうではありませんか?

+0

注:この質問は最小のジェネリックであるように意図されています(https://stackoverflow.com/questions/35855170/why-shouldnt-i-mix-tabs-and-spaces)より頻繁に尋ねられるハスケルの質問の1つの変形。 – Zeta

答えて

4

TL; DR:インスタンスバインディングをインデントします。


警告を有効にして、あなたがインスタンス操作showを実装していないことがわかりますが、同じ名前の代わりに新しい機能:したがって2が今ある

Foo.hs:3:10: Warning: 
    No explicit implementation for 
     either `showsPrec' or `Prelude.show' 
    In the instance declaration for `Show Foo' 

show s。 Main.show(あなたが誤って定義したばかりのもの)とPrelude.show(使用したかったクラスのもの)です。

我々は(我々は完全に自分の名前を修飾する必要が)自分のタイプを見て、それを確認することができます。

あなた whereバインディングを使用すると、通常でそれらをインデントするのと同じように、インデントする必要があるためです
ghci> :t Main.show 
Main.show :: Foo -> [Char] 
ghci> :t Prelude.show 
Prelude.show :: Show a => a -> String 

関数。 1つのスペースでも十分です。

instance Show Foo where 
show Foo = "Foo" 

ハスケルは空白を使用してブロックを区切ります。 whereはいつ他の方法で止まるのですか?

関連する問題