【发布时间】:2023-04-08 21:58:01
【问题描述】:
我仍在尝试掌握 Haskell 和函数式编程的工作方式,我需要帮助来理解为什么我的函数不工作。我正在尝试创建一个函数,该函数将整数列表作为参数并过滤掉/返回一个子列表,该子列表包含第一个列表中 3 的任何倍数。这是我的代码:
module Main where
sublist = []
myFunc :: [Int] -> [Int]
myFunc [] = []
myFunc [t] = do
if t `mod` 3 == 0
then t : sublist
else myFunc []
myFunc (h:t) = do
if h `mod` 3 /= 0
then myFunc t
else do
h : sublist
myFunc t
这仅返回一个包含传递给函数的最后一个值的列表,并且仍然是 sublist = []。感谢您提前给我的任何建议。
【问题讨论】:
-
您的代码看起来好像您不了解不变性的原则。声明
t : sublist根本不会更改子列表,它只是生成一个仅包含t的列表(sublist将始终为空,因为这就是不变性的工作原理 - 绑定不会改变)。 -
这里不需要
dos。在了解 monad 之前不要使用do。 (好吧,在使用 monad 之前,您可能可以使用do符号和IO来逃避,但仅此而已。) -
弄清楚这段代码为什么会编译,以及编译后为什么会这样,对于中级 Haskell 程序员来说是一个很好的练习。 =D
标签: list haskell filter sublist