我将使用一个简单的例子来说明我想要做的事情。
说我有清单:
nums = []
现在我有了这个功能:
allNums n = nums.append(n)
所以,如果我运行该函数:
allNums 6
列表名称应具有值
[6]
我知道nums.append不起作用,但是什么代码可以取代它。
答案 0 :(得分:4)
你不能这样做。 Haskell是一种纯粹的功能语言,意思是:
你可以使用State Monad实现一些行为有点像这样的东西,但这对你来说可能是遥不可及的。
答案 1 :(得分:1)
我建议使用无限列表而不是附加到全局变量。 真正的haskell是纯粹的功能。但它也很懒惰。在真正需要之前,不会计算数据的每个部分。它也适用于集合。因此,您甚至可以使用基于相同集合的先前元素的元素定义集合。 请考虑以下代码:
isPrime n = all (\p -> (n `mod` p) /= 0 ) $ takeWhile (\p ->p * p <= n) primes
primes = 2 : ( filter isPrime $ iterate (+1) 3 )
main = putStrLn $ show $ take 100 primes
当定义素数列表时, isPrime
的定义是琐事。它需要的包质量小于或等于检验数的平方根
takeWhile (\p ->p * p <= n) primes
然后检查数字是否只有非零余数除以所有这些数字
all (\p -> (n `mod` p) /= 0 )
接下来使用这个定义,我们从3开始采用所有数字:
iterate (+1) 3
从他们那里过滤素数。
filter isPrime
然后我们只是将第一个素数加到它前面:
primes = 2 : ( ... )
所以primes
成为一个无限的自我引用列表。
你可能会问:为什么我们在前面加2而且没有开始过滤数字,如:
primes = filter isPrime $ iterate (+1) 2
您可以检查此导致uncomputable expression,因为isPrime
函数至少需要一位primes
的已知成员才能将takeWhile
应用于该作品。
正如您所看到的,primes
定义明确且不可变,但它可能包含您在逻辑中需要的元素。