在haskell中指定do表示法中的元组时出现类型错误

在haskell中指定do表示法中的元组时出现类型错误,haskell,Haskell,这是我的haskell代码: myFold:: ([a] -> (b, [a])) -> [a] -> [b] myFold fn [] = [] myFold fn lst = do (ast, newLst) <- (fn lst) myFold fn newLst ++ [ast] myFold::([a]->(b[a])->[a]->[b] myFold fn[]=[] myFold fn lst=do (ast,newLst)简短回答:停止使

这是我的haskell代码:

myFold:: ([a] -> (b, [a])) -> [a] -> [b]
myFold fn []  = []
myFold fn lst = do
    (ast, newLst) <- (fn lst)
    myFold fn newLst ++ [ast]
myFold::([a]->(b[a])->[a]->[b]
myFold fn[]=[]
myFold fn lst=do

(ast,newLst)简短回答:停止使用
do
符号。它不会做你认为它会做的事。

长答覆:

do
-符号在这里被误用。我不会在这里做一个完整的monad教程,但我会一行一行地告诉你你应该做什么

首先,行
myFold fn lst=do
是错误的,因为您不应该使用
do
-符号,所以让我们删除它:

myFold fn lst =

第二,行
(ast,newLst)您是否打算使用
let
而不是
,Haskell中没有赋值<代码>也许,我会尝试一下,看看结果是否符合我的预期。开始时,我建议明确使用
>=
等,而不是使用
do
符号。一旦你明白了它的好处,就用
do
吧。我想你的意思是:停止使用
do
符号。它不做你认为它做的事
    let (ast, newLst) = fn lst
    in myFold fn newLst ++ [ast]
myFold fn lst =
    let (ast, newLst) = fn lst
    in myFold fn newLst ++ [ast]