从Learn You A Haskell for Great Good教程中解释最大的可分割代码

时间:2010-06-02 18:57:44

标签: haskell

largestDivisible :: (Integral a) => a
largestDivisible = head (filter p [100000,99999..])
    where p x = x `mod` 3829 == 0

如果p x等于True,

确实

head (filter p [100000,99999..])

成为

head (filter True)

为True过滤了哪些列表?

在运行此代码时,p和x的值是什么?

2 个答案:

答案 0 :(得分:4)

filter p [100000,99999..]计算列表,包括从100000开始的所有数字,其中p返回true。 head然后获取该列表的第一个,有效地为您提供低于100000的最大数字x,其中p x返回true,即x `mod` 3829为0。

  

p和x中有什么值?

p是一个函数,它接受一个名为x的参数,并返回true iff x `mod` 3829 == 0x是赋予函数的参数。由于使用p作为参数进行过滤,这意味着列表[100000,99999..]的每个元素将依次赋予p,直到p第一次返回true(它不再尝试任何元素,因为使用head,你只需要一个元素,所以它只计算一个元素。

答案 1 :(得分:3)

p是由p x = x `mod` 3829 == 0定义的函数。

xp函数中的变量。 filter使用列表p中的元素调用[100000,99999..],因此x将成为该列表的成员之一。

filter p [100000,99999..](filter p) [100000,99999..]相同,不是 filter (p [100000,99999..])。所以p [100000,99999..]作为参数调用(无论如何它都是类型错误)。

相关问题