, но я не уверен, что это так.

чание для других потенциальных участников: пожалуйста, не стесняйтесь использовать абстрактные или математические обозначения, чтобы высказать свою точку зрения. Если я нахожу ваш ответ неясным, я попрошу разъяснения, но в остальном не стесняйтесь выразить себя удобным способом.

Чтобы было ясно: яне ищу "сейф"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] -> Возможно a», но теперь вместо того, чтобы обрабатывать пустой список или доказывать, что это не может произойти, вы должны обработать «Nothing» или доказать, что это не может произойти. «.

Тон, который я прочитал из этого комментария, говорит о том, что это заметное увеличение сложности / сложности / чего-то, но я не уверен, что понимаю, что он там делает.

Один Стивен Прузина говорит (в 2011 году не меньше),

«Существует более глубокая причина, почему, например,« head »не может быть защищенным от сбоев. Чтобы быть полиморфным, но обрабатывать пустой список,« head »всегда должен возвращать переменную типа, который отсутствует в каком-либо конкретном пустом списке. Delphic, если Haskell мог сделать это ... ".

Полиморфизм потерян, разрешая обработку пустого списка? Если так, то как и почему? Есть ли конкретные случаи, которые сделали бы это очевидным?В этом разделе достаточно ответа @Russell O'Connor. Любые дальнейшие мысли, конечно, приветствуются.

Я отредактирую это, поскольку ясность и предложение диктуют. Любые мысли, документы и т. Д., Которые вы можете предоставить, будут оценены по достоинству.