从“学习Haskell成就卓越”教程中解释最大可分割的代码

Del*_*ens -2 haskell

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

如果px等于True,

确实

head (filter p [100000,99999..])
Run Code Online (Sandbox Code Playgroud)

成为

head (filter True)
Run Code Online (Sandbox Code Playgroud)

哪些列表正在过滤True?

在运行此代码时,p和x的值是多少?

sep*_*p2k 5

filter p [100000,99999..]计算列表,包括所有从100000下降的数字,其中p返回true。head然后使用该列表的第一个,有效地为您提供小于100000的最大x,该x p x返回true,即为x `mod` 38290。

p和x中有什么值?

p是一个函数,它接受一个称为x且返回true iff的参数x `mod` 3829 == 0x是赋予函数的参数。由于您将p用作过滤的参数,因此这意味着列表中的每个元素[100000,99999..]都会依次赋予p,直到p第一次返回true为止(它不会再尝试其他任何元素,因为使用head,您可以re仅请求一个元素,因此它只计算一个)。