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。但现在我相信它正在用++两边的两个值创建一个新列表。