如何隐藏[](或[]的Monad实例?

时间:2012-08-17 19:02:46

标签: list haskell import monads

我正在努力完成Typeclassopedia中的一些练习,但是我无法定义自己的[] Monad实例,因为我似乎无法隐藏它。我能够有效地隐藏Maybe,但当我尝试隐藏[]时,我收到此错误:parse error on input '['

我正在使用这行代码导入:

import Prelude hiding (Maybe, Just, Nothing, [])

[]更改为([])也无法解决此问题。

我不知道该怎么做。任何帮助都会很棒!谢谢!

2 个答案:

答案 0 :(得分:10)

您可以尝试-XNoImplicitPrelude,但最简单的可能是定义您自己的List类型,其语义等效于[]并实现此类型的实例。

无法隐藏实例,因为即使import Prelude ()也会导入实例。

答案 1 :(得分:4)

基本上,列表语法是魔术和内置的。当Haskell被创建时,列表被认为是如此通用且非常有用,以至于它们需要特殊的方括号语法以使它们更加方便使用。因此,您无法使用与内置[a]相同的语法定义自己的列表类型,同样,您无法隐藏[]语法,只能隐藏if或{where之类的关键字{1}}。这并不能阻止您定义自己的列表类型,定义内置列表类型的转换函数。正如其他人所指出的那样,为自己定义列表功能既不是很难也很有教育意义。

当然,您也可以使用相同的签名定义自己的Monad类,然后使用它。