在haskell中指定do表示法中的元组时出现类型错误
这是我的haskell代码:在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)简短回答:停止使
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]