Примітка іншим потенційним співавторам: Будь ласка, не соромтеся використовувати абстрактні чи математичні позначення, щоб висловити свою думку. Якщо я знайду вашу відповідь незрозумілою, я попрошу її пояснити, але в іншому випадку сміливо висловлюйтеся з комфортом.
Щоб бути зрозумілим: я не шукаю "сейф" head
, а також вибір head
особливо винятково значущого. Основним питанням є обговорення head
і head'
, які служать для забезпечення контексту.
Вже кілька місяців я хакую Хаскела (до того, що це стало моєю основною мовою), але, правда, я недостатньо обізнаний про деякі більш просунуті концепції та деталі філософії мови (хоча Я більш ніж готовий вчитися). Тоді моє питання не стільки технічне (якщо це не так, і я просто цього не усвідомлюю), скільки питання філософії.
На цьому прикладі я кажу 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", але тепер замість того, щоб обробляти порожній список або доводити, що цього не може статися, ви повинні обробити "Нічого" або довести, що це не може статися . '
Тон, який я прочитав із цього коментаря, свідчить про те, що це помітне збільшення складності / складності / чогось, але я не впевнений, що розумію, що він там викладає.
Один Стівен Прузіна каже (у 2011 році, не менше),
"Існує глибша причина, чому, наприклад," head "не може бути захищеною від збоїв. Щоб бути поліморфною, але обробляти порожній список," head "завжди повинна повертати змінну типу, яка відсутня в якомусь конкретному порожньому списку. Це було б Дельфічний, якби Хаскелл міг це зробити ... ".
Чи втрачається поліморфізм, дозволяючи обробляти порожній список? Якщо так, то як і чому? Чи існують окремі випадки, які могли б зробити це очевидним? На цей розділ чудово відповів @Russell O'Connor. Будь-які подальші думки, звичайно, вдячні.
Я відредагую це, як це вимагає чіткість та пропозиція. Будь-які думки, статті тощо, які ви можете надати, будуть дуже вдячні.