Haskell “ListT”的类型-右单声道转换器 我认为“代码> Listt 单元格转换器令人惊讶地棘手。以下假设交换基单子的实现足够困难: instance (Monad m) => Monad (ListT m) where return a = ListT $ return [a] m >>= k = ListT $ do a <- runListT m b <- mapM (runListT . k) a return (concat b) instance(Monad m)=>Monad(ListT m)其中 return a=ListT$return[a] m>>=k=ListT$do a>=)s1 k2= 利斯特$ 无约束s1>>= \案例 没有-> 一无所获 只是(h1,t1)-> 未约束$k2 h1(t1>>=k2)

Haskell “ListT”的类型-右单声道转换器 我认为“代码> Listt 单元格转换器令人惊讶地棘手。以下假设交换基单子的实现足够困难: instance (Monad m) => Monad (ListT m) where return a = ListT $ return [a] m >>= k = ListT $ do a <- runListT m b <- mapM (runListT . k) a return (concat b) instance(Monad m)=>Monad(ListT m)其中 return a=ListT$return[a] m>>=k=ListT$do a>=)s1 k2= 利斯特$ 无约束s1>>= \案例 没有-> 一无所获 只是(h1,t1)-> 未约束$k2 h1(t1>>=k2),haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我不太擅长阅读Haskell代码,但是如果我们假设可能作为基本单子,那么绑定操作的第一个参数应该是(仅1:2:3:[]):[]。它不应该是只有1:2:3:[] 这可能与ListT的惰性要求有关,以尊重关联性,但我无法将所有内容放在一起。unso生成m(Maybe(a,ListT m a))其中m可以是Maybe,从而产生嵌套的Maybe(Maybe…值。我认为假设m=Maybe无助于可视化正在发生的事情,反而会使它变得更难,因为这样很容易混合这两个层。考虑另一个单元格 M >代码来帮助直觉。@我

我不太擅长阅读Haskell代码,但是如果我们假设
可能
作为基本单子,那么
绑定
操作的第一个参数应该是
(仅1:2:3:[]):[]
。它不应该是
只有1:2:3:[]


这可能与
ListT
的惰性要求有关,以尊重关联性,但我无法将所有内容放在一起。

unso生成
m(Maybe(a,ListT m a))
其中
m可以是
Maybe
,从而产生嵌套的
Maybe(Maybe…
值。我认为假设
m=Maybe
无助于可视化正在发生的事情,反而会使它变得更难,因为这样很容易混合这两个层。考虑另一个单元格<代码> M >代码来帮助直觉。@我想我得到了什么让我困惑的主旨。我假设
uncon::listtma->m(可能(a,listtma))
将扮演与
uncon::[a]->可能(a[a])
相同的角色。但前者似乎只是从变压器包装上剥落,对吗?@chi抱歉,我应该更仔细地研究类型。是的,没错,它只是从包装上剥落。但是,从某种意义上说,它确实扮演了“其他”的角色,除了在单子中的
Maybe
结果之上的作用之外。@chi实现是
unso(ListT m)=m
,其中
m
在WHNF中,我想,这是由于懒惰而起作用的。这是一个如此美丽的实现,令人叹为观止!
instance Monad m => Monad (ListT m) where
  return a =
    ListT $ return (Just (a, (ListT (return Nothing))))
  (>>=) s1 k2 =
    ListT $
      uncons s1 >>=
        \case
          Nothing ->
            return Nothing
          Just (h1, t1) ->
            uncons $ k2 h1 <> (t1 >>= k2)