2014-10-18 7 views
0

Вот код.Haskell - Как фильтр и голова работают в комбинации с где?

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

Я немного смущен. Что такое p в этом случае? Кроме того, я не понимаю выражение where в этом конкретном примере, потому что мы получили два выражения с p и x с левой стороны, и у нас есть одно выравнивание, которое на самом деле является логическим.

Я был бы признателен, если бы кто-нибудь мог объяснить мне приведенный выше код.

+0

Таким образом, это означает, что для первого случая: p 100000 Затем он оценивает p. Он возвращает true для p, если 100000 делится на 3829. Правильно? – tumbler

+0

Да, но тогда вам нужно подумать о том, что делает 'filter' в этом случае. Когда вы понимаете, что делает 'filter', когда' p' возвращает 'True' и что' filter' делает, когда 'p' возвращает' False', вы можете сказать, что делает 'head'. –

+0

@SassaNF: filter - это тип (a -> Boolean) -> [a] -> [a]. В этом случае он возвращает false для 100000. Таким образом, первый аргумент является ложным, поэтому 100000 не помещается в новый построенный список. Это что-то вроде этого? – tumbler

ответ

2

p является функцией, которая принимает аргумент x и возвращает True только тогда, когда х делится на 3829. Вы можете использовать where определить локальные функции так же, как вы определяете местные «ценности», используя тот же самый f x = y синтаксис, используемый для определить функции верхнего уровня.

+0

Имеет ли второй p какое-либо отношение к первому p? – tumbler

+0

. фильтр> 5 [4,2,3,8,7] вернется [8,7]. Таким образом, в этом случае первый p будет эквивалентен> 5. Но в приведенном выше примере, что там p? – tumbler

+0

Является ли список не бесконечным? Разве это не проблема? Сначала применяется фильтр. Но если список бесконечен, «фильтр» никогда не завершит свою работу? – tumbler

 Смежные вопросы

  • Нет связанных вопросов^_^