【发布时间】:2018-05-04 08:31:00
【问题描述】:
虽然我一直在阅读文档,但我一直认为a 可以是:
example :: a -> a
“a”可以是Char、String、Int、Integer。
当然,如果我说:
example :: [a] -> a
输入应该是一个列表,但可以是任何列表:["ab", "cd"]、[1,2] 或 ['s', 'c']。
但在我的代码中:
toString' :: (Show a) => [a] -> String
toString' [] = "empty"
toString' [x] = " and " ++ show x
toString' (x:y:[]) = show x ++ toString' [y]
toString' (x:xs) = show x ++ ", " ++ toString' xs
它应该可以工作,但并不总是有效:
Prelude> toString' ['a', 'b', 'c'] -- Works
Prelude> toString' [1, 2, 3] -- Don't work
Prelude> toString' ["abc", "bc", "efc"] -- Don't work
我不明白为什么我需要添加 Show 约束,如果通常在本书的示例中我不需要它。
更新
好吧,不,这不是从["abc", "bc", "efc] 到["abc", "bc", "efc"] 的变化,实际上在代码中我是对的,只是在这里我首先输入了错误。
关于Show,如果有必要在这段代码中使用,你能回答我吗?
更新 2
如果你投了反对票,我不知道这是否有用,或者它会被关闭,但无论如何
如果我在最后一行使用代码,代码效果会更好:
toString' (x:xs) = show x ++ ", " ++ (toString' xs)
但仍然不明白为什么我需要Show(我的意思是,为什么我不能从代码中删除它?)
更新 3
我看到Show 的错误,如果你使用变量类型a 而不是String,你需要Show,可能是因为它可能 Haskell 不知道它是哪种类型,直到你输入一个值,所以它需要知道你想要显示它,或者因为某些类型的变量本身不会扩展 Show。
【问题讨论】:
-
最后一个是因为你忘了关闭一个字符串字面量。
-
第二个确实对我有用。
-
“我也不明白为什么我需要把'show'放在书中的例子中它不需要它。” - 这可能应该是一个单独的问题,你应该详细说明它,例如通过展示您不需要它的示例之一。
-
投票结束,答案结果是“这是一个错字”的问题不在 SO 上。
-
好的,谢谢@WillNess ;)
标签: haskell types typeclass type-constraints parametric-polymorphism