Примечание для других потенциальных участников: Пожалуйста, не стесняйтесь использовать абстрактные или математические обозначения, чтобы сделать вашу мысль. Если я нахожу ваш ответ неясным, я попрошу разъяснения, но в остальном вы можете выразить себя в удобной манере.
Чтобы быть ясным: я не ищу "безопасный" head
, а выбор head
в особенности исключительно значим. Мясо вопроса следует за обсуждением head
и head'
, которые служат для обеспечения контекста.
Я уже несколько месяцев взламываю Haskell (до такой степени, что это стало моим основным языком), но я, по общему признанию, недостаточно информирован о некоторых более продвинутых концепциях и деталях языка философии (хотя я более чем готов учиться). Мой вопрос тогда не настолько технический (если это не так, и я просто не понимаю), поскольку он является одним из философов.
В этом примере я говорю о head
.
Как я понимаю, вы будете знать,
Prelude> head []
*** Exception: Prelude.head: empty list
Это следует из head :: [a] -> a
. Справедливо. Очевидно, нельзя возвращать элемент (без малейшего) типа. Но в то же время просто (если не тривиально) определить
head' :: [a] -> Maybe a
head' [] = Nothing
head' (x:xs) = Just x
Я видел небольшое обсуждение этого здесь в разделе комментариев некоторых утверждений. Примечательно, что один Алекс Стангл говорит
"Есть веские причины не делать все" безопасным "и бросать исключения, когда нарушаются предварительные условия.
Я не обязательно сомневаюсь в этом утверждении, но мне любопытно, каковы эти "веские причины".
Кроме того, Пол Джонсон говорит:
'Например, вы можете определить "safeHead:: [a] → Maybe a", но вместо того, чтобы обрабатывать пустой список или доказывать, что этого не может быть, вам нужно обработать "Nothing" или доказать, что он может "Слушай".
Тон, который я прочитал из этого комментария, говорит о том, что это заметное увеличение сложности/сложности/чего-то, но я не уверен, что понимаю, что он там там.
Один Стивен Прузина говорит (в 2011 году, не менее),
"Там более глубокая причина, почему, например," голова "не может быть краш-доказательством. Чтобы быть полиморфным, но обрабатывать пустой список," head "всегда должен возвращать переменную типа, отсутствующего в каком-либо конкретном пустом списке. Это был бы Дельфий, если бы Хаскелл мог это сделать...".
Является ли полиморфизм потерянным, позволяя пустую обработку списка? Если да, то как и почему? Существуют ли особые случаи, которые сделают это очевидным? В этом разделе достаточно ответа от @Russell O'Connor. Любые дальнейшие мысли, конечно, оценены.
Я отредактирую это, поскольку ясность и предложение диктуют. Любые мысли, документы и т.д., Которые вы можете предоставить, будут наиболее ценными.