将整数附加到函数haskell中的全局列表

时间:2014-10-29 18:02:32

标签: list function haskell append

我将使用一个简单的例子来说明我想要做的事情。

说我有清单:

nums = []

现在我有了这个功能:

allNums n = nums.append(n)

所以,如果我运行该函数:

allNums 6

列表名称应具有值

[6] 

我知道nums.append不起作用,但是什么代码可以取代它。

2 个答案:

答案 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 ) 

$这里是application operator

接下来使用这个定义,我们从3开始采用所有数字:

iterate (+1) 3

从他们那里过滤素数。

filter isPrime 

然后我们只是将第一个素数加到它前面:

primes = 2 : ( ... )

所以primes成为一个无限的自我引用列表。

你可能会问:为什么我们在前面加2而且没有开始过滤数字,如:

primes = filter isPrime $ iterate (+1) 2

您可以检查此导致uncomputable expression,因为isPrime函数至少需要一位primes的已知成员才能将takeWhile应用于该作品。

正如您所看到的,primes定义明确且不可变,但它可能包含您在逻辑中需要的元素。