Почему в Haskell не исчерпывающе? шаблоны не являются ошибками времени компиляции?

android:gravity="center" 

работает только с RelativeLayouts. Так что попробуйте

<TextView
        android:id="@+id/title"
        android:layout_width="fill_parent" <!--relative Layout-->
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Mint Payments"/>
29
задан Community 23 May 2017 в 12:10
поделиться

1 ответ

Вы можете использовать -Werror, чтобы превратить предупреждения в ошибки. Я не знаю, можете ли вы превратить только предупреждения неисчерпывающих шаблонов в ошибки, извините!

Что касается третьей части вашего вопроса:

Я иногда пишу ряд функций, которые как правило, тесно сотрудничают и имеют свойства, которые вы не можете легко выразить в Haskell. По крайней мере, некоторые из этих функций имеют тенденцию иметь неисчерпывающий характер, обычно это «потребители». Это происходит, например, в функциях, которые являются своего рода инверсиями друг друга.

Пример игрушки:

duplicate :: [a] -> [a]
duplicate [] = []
duplicate (x:xs) = x : x : (duplicate xs)

removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates [] = []
removeDuplicates (x:y:xs) | x == y = x : removeDuplicates xs

Теперь довольно легко увидеть, что removeDuplicates (duplicate as) равно as (всякий раз, когда тип элемента находится в Eq), но в целом duplicate (removeDuplicates bs) завершится сбоем, потому что есть нечетное количество элементов или 2 последовательных элемента отличаются. Если он не падает, это потому, что bs был создан (или мог быть создан) duplicate в первую очередь !.

Итак, у нас есть следующие законы (не действует на Haskell):

removeDuplicates . duplicate == id
duplicate . removeDuplicates == id (for values in the range of duplicate)

Теперь, если вы хотите предотвратить неисчерпывающие паттерны здесь, вы можете заставить removeDuplicates возвращать Maybe [a] или добавить сообщения об ошибках для пропущенных случаев. Вы могли бы даже сделать что-то вроде

newtype DuplicatedList a = DuplicatedList [a]

duplicate :: [a] -> DuplicatedList a
removeDuplicates :: Eq a => DuplicatedList a -> [a]
-- implementations omitted

Все это необходимо, потому что вы не можете легко выразить «быть списком четной длины с последовательными равными парами элементов» в типе Haskell system (если вы не Олег:)

Но если вы не экспортируете removeDuplicates, я думаю, что вполне нормально использовать здесь неисчерпывающие шаблоны. Как только вы его экспортируете, вы потеряете контроль над входными данными и будете иметь дело с отсутствующими случаями!

14
ответ дан 28 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: