2016-04-30 13 views
2

Cell型をShow型のメンバにしようとしています。 show a行に問題があります。どのようにaがショーケースでCharであることを確認しますか?私は、この声明の発注がフォールスルーに対応することを期待していましたが、それはそれをしません。Typeclass宣言型の不一致

data Cell = Solid | Blank | Char 

instance Show (Cell) where 
    show Solid = "X" 
    show Blank = "_"; 
    show a = [a] 

main = print $ show Solid 

答えて

2
data Cell = Solid | Blank | Char 

これは、Solidを意味し、tagged unionBlank、そしてCharは、コンストラクタ名、ないタイプです。たとえば、Char :: Cellです。

私はあなたがこのようなものだった何を意味するのか疑う

data CellType = CellConstructor Char 

instance Show CellType where 
    show (CellConstructor c) = [c] 

例:

  • CellConstructor 'X' :: CellType
  • CellConstructor '_' :: CellType
  • CellConstructor 'a' :: CellType

コンストラクタが1つしかない場合は、型とコンストラクタに同じ名前を付けるのが通例です。

フィールドが1つしかないコンストラクタが1つしかない場合は、newtypeを使用するのが通常です。

newtype Cell = Cell Char 
1

CharここではタイプがCharではありません。これはCharという名前の新しいデータコンストラクタです。

> show Solid 
"X" 
> show Blank 
"_" 
> show (Char '4') 
"4" 
0

は主にshow機能で、型クラスShowの定義を見て:あなたはCellSolidBlank、またはタイプCharの値になりたい場合は、

data Cell = Solid | Blank | Char Char 

instance Show Cel where 
    show Solid = "X" 
    show Blank = "_" 
    show (Char c) = [c] 

いくつかの例を必要とします:

class Show a where 
    show  :: a -> String 

ここで、お客様のCellタイプはそれを満足させますか?最初のケースはshow Solid = "X"です - SolidCell"X"は文字列です。後者の場合も同様です。しかし、3番目のケースは何ですか? show a = [a]と定義したため、タイプシグネチャはCell -> [Cell]で、[Cell]Stringではありません。したがって、タイプの不一致が発生します。

3

aは、Charの値であることを確認することはできません。理由は単純ではないからです。 aは常にタイプCellの値になります。具体的には値Char(これはタイプCharとは関係ありません)です。

Cellの3番目のコンストラクタには、Charの値が含まれていると思われます。あなたのコンストラクタは、パラメータを必要としていることを実行します。

コンストラクタ CharCellが使用されており、 a値が CharCellとして使用する場合のパラメータ(ひいてはタイプ Charを持っていることが CharCellあるとして「 CharCell aケースが一致し
data Cell = Solid | Blank | CharCell Char 

instance Show (Cell) where 
    show Solid = "X" 
    show Blank = "_" 
    show (CharCell a) = [a] 

sパラメータタイプ)。

関連する問題