我正在努力完成Typeclassopedia中的一些练习,但是我无法定义自己的[]
Monad实例,因为我似乎无法隐藏它。我能够有效地隐藏Maybe
,但当我尝试隐藏[]
时,我收到此错误:parse error on input '['
我正在使用这行代码导入:
import Prelude hiding (Maybe, Just, Nothing, [])
将[]
更改为([])
也无法解决此问题。
我不知道该怎么做。任何帮助都会很棒!谢谢!
答案 0 :(得分:10)
您可以尝试-XNoImplicitPrelude
,但最简单的可能是定义您自己的List
类型,其语义等效于[]
并实现此类型的实例。
无法隐藏实例,因为即使import Prelude ()
也会导入实例。
答案 1 :(得分:4)
基本上,列表语法是魔术和内置的。当Haskell被创建时,列表被认为是如此通用且非常有用,以至于它们需要特殊的方括号语法以使它们更加方便使用。因此,您无法使用与内置[a]
相同的语法定义自己的列表类型,同样,您无法隐藏[]
语法,只能隐藏if
或{where
之类的关键字{1}}。这并不能阻止您定义自己的列表类型,定义内置列表类型的转换函数。正如其他人所指出的那样,为自己定义列表功能既不是很难也很有教育意义。
当然,您也可以使用相同的签名定义自己的Monad
类,然后使用它。