2015-05-20 2 views
1
sorted :: Ord a => [a] -> Bool 
sorted xs = and [x <= y | (x,y) <- pairs xs] 

Может кто-нибудь объяснить мне, что это за случайный and делает после =? Он работает, когда я скомпилирую его, но для меня это не логично. Это потому, что Haskell работает рекурсивно и использует and для сравнения следующего элемента?Немного путаницы с сортировкой в ​​Haskell

Любое понимание очень ценится.

ответ

8

Если функция pairs :: [a] -> [(a, a)] определена где выражение

[x <= y | (x,y) <- pairs xs] 

является списком из булевых (то есть, его типа [Bool]). and - функция, тип которой [Bool] -> Bool: она принимает список логических элементов и возвращает True, если все булевы в списке True и False в противном случае.

and [x <= y | (x,y) <- pairs xs] - приложение-функция (and применяется к значению, созданному при понимании списка).

Следует отметить, что Haskell не имеет большого количества специальных ключевых слов. Многие операции представлены функциями, а не специальным синтаксисом или ключевыми словами.

+0

Спасибо, расчистили все. –

1

and не является функцией для принятия логических и двух булевых значений; это && (с типом Bool -> Bool -> Bool).

Вместо этого and имеет тип [Bool] -> Bool; он конденсирует произвольное количество булевых значений до одного путем «и их всех».

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