Haskell中的块是否未按预期运行

Haskell中的块是否未按预期运行,haskell,monads,Haskell,Monads,看来一些必须养成的习惯一定在起作用 此代码的要点是向filterA、filterB和output添加一个值,只要n不是相应过滤器列表的一部分(对于此函数,它是filterA)。接受的输入被添加到两个过滤器中,即使这里没有显示B函数(看起来类似) 我显然误解了do的工作方式,因此在这段代码中通过do块运行的代码会返回如下内容: *Main>funA 4 [14,14,14,14] 我不明白在do块中添加到单独的列表是怎么搞混的。如何在同一功能下执行多个操作而不相互干扰 除此之外,如果我删除其中一个

看来一些必须养成的习惯一定在起作用

此代码的要点是向
filterA
filterB
output
添加一个值,只要
n
不是相应过滤器列表的一部分(对于此函数,它是
filterA
)。接受的输入被添加到两个过滤器中,即使这里没有显示B函数(看起来类似)

我显然误解了
do
的工作方式,因此在这段代码中通过
do
块运行的代码会返回如下内容:

*Main>funA 4
[14,14,14,14]

我不明白在
do
块中添加到单独的列表是怎么搞混的。如何在同一功能下执行多个操作而不相互干扰

除此之外,如果我删除其中一个
filterA++[(3…
行,结果将变成
[14,14]
,删除这两行将得到所需的结果
[14]
,当然减去将值连接到
filterA
filterB
。但是,如果同时删除这两行,则会产生四个副本


TL:DR我如何在
do
块中执行多个单独的操作?不深入单子就可以理解吗?缺少一个更简单的解决方案吗?

附加列表不是一个操作。
filterA++[3*n+2]
不是一个操作,而是一个表达式。它的计算结果是列表

您可能希望使用IO单子。但是您定义的函数的返回类型是List而不是IO。在您的定义中,do块表示List单子而不是IO单子

在Haskell中,一旦定义了值,就不能更改

您可能需要执行以下操作

filterA = [3]
filterB = [2]
output = []

funA n =
if not (elem (n) filterA)
    then do  
        filterA ++ [(3 * n + 2) ] 
        filterB ++ [(3 * n + 2) ]
        output ++ [(3 * n + 2)]
        else output

追加列表不是一个操作。
filterA++[3*n+2]
不是一个操作,而是一个表达式。它的计算结果是list

您可能希望使用IO单子。但是您定义的函数的返回类型是List而不是IO。在您的定义中,do块表示List单子而不是IO单子

在Haskell中,一旦定义了值,就不能更改

您可能需要执行以下操作

filterA = [3]
filterB = [2]
output = []

funA n =
if not (elem (n) filterA)
    then do  
        filterA ++ [(3 * n + 2) ] 
        filterB ++ [(3 * n + 2) ]
        output ++ [(3 * n + 2)]
        else output

你认为filterA++[(3*n+2)]在做什么?我原以为它“添加”了filterA。但现在我相信它正在用++两边的两个值创建一个新的列表。你认为
filterA++[(3*n+2)]怎么样
正在做什么?我原以为它“添加”到了filterA。但现在我相信它正在用++两边的两个值创建一个新列表。