Haskell 不使用do符号就可以编写此代码吗?

Haskell 不使用do符号就可以编写此代码吗?,haskell,linked-list,monads,do-notation,Haskell,Linked List,Monads,Do Notation,我有一些功能 bar :: MyType -> MyType -> [MyType] 我想有另一个功能: foo :: [MyType] -> [MyType] foo xs = do x <- xs y <- xs bar x y 不使用do符号就可以编写foo吗?我在考虑像liftA2这样的东西,但那是行不通的。我们可以使用do块的算法转换,如下所述: 但是我们可以通过省略y变量来减少lambda表达式的数量:

我有一些功能

bar :: MyType -> MyType -> [MyType]
我想有另一个功能:

foo :: [MyType] -> [MyType]
foo xs = do x <- xs
            y <- xs
            bar x y

不使用do符号就可以编写foo吗?我在考虑像liftA2这样的东西,但那是行不通的。

我们可以使用do块的算法转换,如下所述:

但是我们可以通过省略y变量来减少lambda表达式的数量:

foo :: [MType] -> [MType]
foo xs = xs >>= \x -> xs >>= bar x
我们也可以省略x变量,方法是将\x->xs>>=条x写为xs>>=。酒吧

或者,我们可以使用和的组合:


您还可以使用以下模式来改变bar的算术数:

第2部分

-- bar :: [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs
第三部分

-- bar :: [MType] -> [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs <*> xs
等等


我喜欢这个,因为它比硬编码的liftA2更容易扩展。

所有do符号都可以用>>=和return重写,对于这个,甚至还有一个特殊用途的函数。对,你在技术上是正确的。我真正的意思是,如果我能用Control.Applicative或Control.Monad和no lambdas中的函数以某种自然的方式重写它。通过>>=重写通常需要很多lambda。我们正在考虑像liftA2这样的东西,但这不起作用。为什么不呢?@M.Aroosi:请注意,这里的bar是一元类型,它不是返回bar x y,而是简单的bar x y。对,您可以使用liftA2并加入tho。
foo :: [MType] -> [MType]
foo xs = join (liftA2 bar xs xs)
-- bar :: [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs
-- bar :: [MType] -> [MType] -> [MType]
foo :: [MType] -> [MType]
foo xs = join $ bar <$> xs <*> xs <*> xs