1

多分値をCharに変換しようとしています。次のエラーが発生します。最善を尽くしても、これを修正する方法がわかりません。

convertmaybe.hs:18:22:
    No instance for (ToChar a)
      arising from a use of `toChar'
    In the expression: toChar a
    In an equation for `showMaybe': showMaybe (Just a) = toChar a
Failed, modules loaded: none.

これはコードです:

class ToChar a where
    toChar :: a -> Char
instance ToChar Char where
    toChar = id
instance ToChar Int where
    toChar = head . show

showMaybe :: Maybe a -> Char
showMaybe Nothing = ' '
showMaybe (Just a) = toChar a

私はここで何が間違っているのですか?

4

1 に答える 1

9

欠落しているのは、showMaybe型署名の制約です。あなたの現在の署名

showMaybe :: Maybe a -> Char

この関数はすべての型aで機能するはずですが、実際にはToChar型クラスのインスタンスである型でのみ機能すると述べています。これを修正するには、型シグネチャに制約を追加します。

showMaybe :: (ToChar a) => Maybe a -> Char
showMaybe Nothing = ' '
showMaybe (Just a) = toChar a

型関連のエラーを把握するための良いトリックは、型シグネチャを削除し、GHCIにどの型を推測するかを尋ねることです(それが可能であると仮定します)。したがって、署名をすべて一緒に削除すると

showMaybe Nothing = ' '
showMaybe (Just a) = toChar a

GHCIを起動すると、結果が得られます

:~$ ghci scratch.hs 
GHCi, version 7.6.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( scratch.hs, interpreted )
Ok, modules loaded: Main.
*Main> :t showMaybe 
showMaybe :: ToChar a => Maybe a -> Char
*Main> 
于 2012-11-30T00:41:17.273 に答える