从验证的例子(https://hackage.haskell.org/package/Validation),我试图直观地检测应用程序如何/为什么不能是 Monad (为什么 AccValidation 不能有 Monad 实例?)
你能挑战我的推理吗?
我以我们处理连接 (m ( m b) -> m b) 的方式思考一个 monad,让我们通过一个像验证这样的例子来加深我的理解:
in data Validation err a
,函子结构为 (Validation err)。当您查看 Monad 的绑定定义并专门化验证类型时,您会得到以下结果:
(>>=) :: m a -> (a -> m b) -> m b
(>>=) :: (Validation err) a -> ( a -> (Validation err) b) -> (Validation err) b
如果你减少(>>=)你会得到:
m a -> (a -> m b) -> m b // if we apply (m a) in the monadic function
m ( m b) -> m b
然后要获得 (>>=) 的结果,即 m b,您将使用 join :
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
如果你使用这些类型,你会得到:
join m ( m b ) = m ( m b) >>= (\(m b) -> m b -> m b) which gives m b
因此,该连接只是删除最外层的结构,只有最内层类型中的值(最内层函子的值)通过序列保留/传输。
在 monad 中,我们无法将一些信息从函子结构(例如验证错误)传递到下一个“动作”,我们唯一可以传递的就是值。您对该结构唯一可以做的就是使序列短路以从中获取信息。
您无法对函子结构中的信息执行一系列操作(例如累积错误之类的东西......)
所以我想说,一个用其结构上的某些逻辑来压缩其结构的应用程序可能会因为无法成为 Monad 而受到怀疑?