如何在Haskell中单独使用任意数量的Monad?

时间:2017-11-02 22:58:04

标签: haskell monads

我们说我有

x :: Monad a => [a]
x = [item1, item2, item3, ...]

我想这样做:

y f = f <$> item1 <*> item2 <*> item3 <*> item4 <*> ...

之前我曾尝试过使用ZipLists进行此操作:

zipf' x (y:z) = getZipList $ foldl (<*>) (x <$> y) z

但不幸的是,它回复了这个:

<interactive>:94:36: error:
• Occurs check: cannot construct the infinite type: a1 ~ a -> a1
  Expected type: ZipList a1 -> ZipList a -> ZipList a1
    Actual type: ZipList (a -> a1) -> ZipList a -> ZipList a1
• In the first argument of ‘foldl’, namely ‘(<*>)’
  In the second argument of ‘($)’, namely ‘foldl (<*>) (x <$> y) z’
  In the expression: getZipList $ foldl (<*>) (x <$> y) z
• Relevant bindings include
    z :: [ZipList a] (bound at <interactive>:94:12)
    y :: ZipList a (bound at <interactive>:94:10)
    x :: a -> a1 (bound at <interactive>:94:7)
    zipf' :: (a -> a1) -> [ZipList a] -> [a1]
      (bound at <interactive>:94:1)

1 个答案:

答案 0 :(得分:4)

类型

x :: Monad a => [a]

是不可能的:你不能拥有这样的东西,因为Monad需要一个类型参数。你可能意味着

x :: Monad m => [m a]

之后,下一个问题是:y的类型是什么?它需要一个函数f,并且f以某种方式接受任意数量的参数?这听起来不对,这就是GHC抱怨无限类型的原因:f的类型必须包含f本身类型的子项。

也许你的意思更像foldM?无论foldM是否是您所需要的,一旦您确定了正在使用的函数的类型,您的搜索将会更容易。