【发布时间】:2012-07-21 05:54:06
【问题描述】:
我想为列表单子提供我自己的实例。不幸的是,以下导致编译时重复实例声明错误。
myReturn :: a -> [a]
myBind :: [a] -> (a -> [b]) -> [b]
instance Monad [] where
return = myReturn
(>>=) = myBind
从文档来看,导入时似乎无法隐藏实例声明,而且由于 list monad 实例已经在前奏中声明,我想我也无法摆脱导入本身。
我想也许我至少可以重新绑定(>>=) 和return,这样我就可以使用我自己的实现来使用do 块,因为do 块据说只是(>>=) 和@987654326 应用程序的语法糖@。
let
return = myReturn
(>>=) = myBind
in
do
item1 <- list1
item2 <- list2
return (item1, item2)
不幸的是,块似乎是从其他地方获取(>>=),因为它仍在使用默认列表单子实例的(>>=)。
有什么方法可以让我的 (>>=) 和 return 实现成为 list monad 的一个实例,或者至少可以将它们与 do 块一起使用?
【问题讨论】:
-
请记住,monad 实现
Monad类型类的方法是不够的,每个 monad 实例都应该遵守“monad 法则”haskell.org/haskellwiki/Monad_Laws。如果一个实例不遵守单子定律,计算可能会导致错误的结果。 -
参见 RebindableSyntax 。
标签: haskell functional-programming monads typeclass