相关疑难解决方法(0)

重新定义列表monad实例

我想为列表monad提供我自己的实例.不幸的是,以下内容在编译时会导致重复的实例声明错误.

myReturn :: a -> [a]
myBind :: [a] -> (a -> [b]) -> [b]
instance Monad [] where
    return = myReturn
    (>>=) = myBind
Run Code Online (Sandbox Code Playgroud)

从文档来看,似乎不可能在导入时隐藏实例声明,并且由于列表monad实例已经在前奏中声明,我想我也无法摆脱导入本身.

我想也许我至少可以重新绑定(>>=),return以便我可以使用自己的实现来使用do块,因为块应该只是(>>=)和的应用程序的语法糖(>>).

let
    return = myReturn
    (>>=) = myBind
in
    do
        item1 <- list1
        item2 <- list2
        return (item1, item2)
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎块(>>=)从其他地方获取它们,因为它仍然使用(>>=)默认列表monad实例.

有没有办法让我的实现(>>=)returnlist monad的实例,或者至少是一种方法来使用do块?

monads haskell functional-programming typeclass

3
推荐指数
1
解决办法
691
查看次数

在Haskell中列出monad的实例 - 为什么在bind-operation中使用concat?

我在这里找到了一些问题:重新定义monad list实例.我现在正试着把头包裹在monad周围.但是我需要一些帮助,我不会将列表的实例定义作为monad.

这是我给monad的列表实例的定义:

    instance Monad [] where
    xs >>= f = concat $ map f xs
    return x = [x]
    fail _ = []
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么我需要在bind-function中使用concat.这是我的定义(>>=):

    (>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)

所以我有一些monadic值m a和一个函数,取一个值a并产生一个m b作为参数给出的monadic值.我' a从'进入' m a函数(a -> m b),因此得到一个monadic值m b.用我自己的话说:bind-operator (>>=)允许链接monadic函数(返回monadic值),其中早期函数的输出值是下一个函数的输入.对?

回到列表实例.在每个值上map f xs使用该函数.结果如此.这就是我想要的全部与否?我该怎么用?定义如下:fxsmap (*2) [1,2,3][2,4,6]concat …

monads haskell function list

2
推荐指数
1
解决办法
233
查看次数