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 "[]"

的类型showStringString -> ShowSShowS是 的类型同义词String -> String,因此 的结果showString "[]"是将字符串"[]"添加到其参数的函数。由于您没有给出类型签名,因此该等式确定了为函数推断出的类型,但其他等式与该类型不匹配。

你可能只是想要

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