haskell - 扩展 Data.Functor.Foldable 时遇到问题

标签 haskell recursion-schemes

此问题使用 http://hackage.haskell.org/package/recursion-schemes-4.0/docs/Data-Functor-Foldable.html 中的概念/导入

我正在尝试扩展它以通过变形来线程化给定的单子(monad)。这是我尝试编译的代码:

class (Monad m, Foldable t) => FoldableM m t where
  distM :: Base t (m a) -> m (Base t a)

  cataM :: (Base t a -> m a) -> t -> m a 
  cataM f = join . liftM f . distM . fmap (cataM f) . project

但是调用distMcataM由于某种原因无法弄清楚使用相同的 t

我得到的错误是:

Expected type: Base t (m a) -> m (Base t a)
Actual type: Base t0 (m a) -> m (Base t0 a) 

我在这里让代码变得不那么性感,并且更容易调试:

cataM :: forall a . (Base t a -> m a) -> t -> m a
cataM f t = join d
  where
  a :: Base t t
  a = project t

  b :: Base t (m a)
  b = fmap (cataM f) a

  g :: Base t (m a) -> m (Base t a)
  g = distM

  c :: m (Base t a)
  c = g b

  d :: m (m a)
  d = liftM f c

g的定义是什么导致了这个问题。

编辑:据我了解,问题是当它调用 distM 时它只有Base t推断类型,因此无法计算出 t 。这很令人沮丧,因为我知道什么t我想用。事实上,我想是否可以向 distM 提供类型参数手动它可以解决问题,但我认为这是不可能的。

这是一个解决方案,但我对此不满意:

class (Monad m, Foldable t) => FoldableM m t where
  distM :: t -> Base t (m a) -> m (Base t a)

  cataM :: forall a . (Base t a -> m a) -> t -> m a
  cataM f = join . liftM f . distM (undefined :: t) . fmap (cataM f) . project

编辑2:很高兴了解Proxy (感谢安塔尔)。我已经使用 Haskelling 多年了,刚刚又学到了一个新东西。我喜欢这门语言。我正在使用的解决方案是:

class (Monad m, Foldable t) => FoldableM m t where
  distM :: proxy t -> Base t (m a) -> m (Base t a)

  cataM :: forall a . (Base t a -> m a) -> t -> m a
  cataM f = join . liftM f . distM (Proxy :: Proxy t) . fmap (cataM f) . project

最佳答案

Base t 是一个类型族,因此 GHC 无法识别 tBase t。如果不提及 t,就无法让 distM 工作。

关于haskell - 扩展 Data.Functor.Foldable 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076044/

相关文章:

sqlite - 安装 HDBC-SQlite3 Haskell

unit-testing - 针对 JSON API 的 Haskell 功能测试

haskell - 同态中的森林砍伐

haskell - 如何在用递归方案编写的表达式求值器中编写更少的样板

haskell - Haskell 中的 RamdaJS reduceBy() 使用递归方案

Haskell - 尽管 foldl' 和严格的数据结构,内存使用量过多

list - 在 Haskell 中对列表进行三角化

haskell - 如何捕获在 C 函数调用的 Haskell 回调函数中引发的 Haskell 异常?

haskell - 如何使用递归方案到 `cata` 两个相互递归的类型?