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代码,但是如果我们假设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 >代码来帮助直觉。@我
可能作为基本单子,那么绑定
操作的第一个参数应该是(仅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)