0

haskellで独自のリストタイプを作成しようとしましたが、実装にエラーが含まれています。これをうまく行うための適切な方法は何ですか。少し説明してください。ありがとうございました。

私のコード:

data List a = EmptyList | ListElement a (List a) 

instance (Show a) => Show (List a) where
        show = showList'

showList' EmptyList = showString "[]"
showList' (ListElement a EmptyList) = show a
showList' (ListElement a b) = show a ++ show " " ++ showList' b

エラーコード:

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

tipusok.hs:12:39:
    Couldn't match expected type `Prelude.String -> Prelude.String'
                with actual type `[Char]'
    Expected type: ShowS
      Actual type: Prelude.String
    In the return type of a call of `show'
    In the expression: show a
Failed, modules loaded: none.
4

2 に答える 2

4

show関数の構成が正しくありません。値を補間するつもりだと思います。

showList' (ListElement a b) = show a . showChar ' ' . show b

次のようになります。

showList' (ListElement a b) = show a ++ " " ++ showList' b
于 2012-05-21T20:01:10.213 に答える
3
showList' EmptyList = showString "[]"

の型はshowStringですString -> ShowSShowSは の型シノニムでString -> Stringあるため、 の結果は、文字列をその引数showString "[]"の先頭に追加する関数です。"[]"型シグネチャを与えていないため、その方程式は関数に対して推論される型を決定しますが、他の方程式はその型と一致しません。

あなたはおそらく単純に望んでいた

showList' EmptyList = "[]"
于 2012-05-21T20:15:51.503 に答える