我想为列表单子提供我自己的实例。不幸的是,以下内容在编译时会导致重复实例声明错误。
myReturn :: a -> [a]
myBind :: [a] -> (a -> [b]) -> [b]
instance Monad [] where
return = myReturn
(>>=) = myBind
从文档来看,导入时似乎无法隐藏实例声明,并且由于列表 monad 实例已经在前奏中声明,我想我也无法摆脱导入本身。
我想也许我至少可以重新绑定(>>=)
,return
这样我就可以使用我自己的实现来使用 do 块,因为 do 块据说只是(>>=)
and应用程序的语法糖(>>)
。
let
return = myReturn
(>>=) = myBind
in
do
item1 <- list1
item2 <- list2
return (item1, item2)
不幸的是,块似乎是(>>=)
从其他地方获取它们的,因为它仍在使用(>>=)
默认列表 monad 实例。
有什么方法可以让我的实现(>>=)
和return
一个 list monad 的实例,或者至少有一种方法可以将它们与 do 块一起使用?