我想为列表单子提供我自己的实例。不幸的是,以下内容在编译时会导致重复实例声明错误。
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 块一起使用?