Отправка сообщений об ошибке в диагностический поток
Функция error принимает в качестве аргумента строку и выводит эту строку в диагностический поток.
factorial'' 0 = 1 factorial'' n = if n < 0 then error "arg must be >= 0" else n * factorial'' (n - 1)
Функция undefined всегда прерывает выполнение программы выводя в диагностический поток стандартное сообщение об ошибке.
С точки статической семантики Haskell не завершающаяся рекурсия и прерывание программы из-за ошибки это одно и то же. Считается, что в этом случае возвращаемым значением программы служит специальный символ, который обозначается символом ⊥ и называется по-английски "bottom", но на русский его иногда переводят как "основание". Это значение является элементом любого типа в Haskell. И функция undefined как раз является способом использовать это значение. Функция undefined подходит в качестве выражения любого типа. А это значит, что она может использоваться в любом месте программы. При программировании на Haskell принято использовать значение undefined для того чтобы маркировать еще не написанные части программы. Проверка типов гарантировано пройдет. Иногда функцию undefined используют для того чтобы поместить её в такое место до которого исполнение гарантировано не дойдет. В противном случае используют функцию error, а не undefined, если исполнение программы дойдет до этой точки, то лучше пользователю сообщить содержательную информацию о том что же за ошибка произошла.
Метод show класса типов Show берет значение некоторого типа и возвращает строку, которая является представлением этого значения. Функция read полиморфна по возвращаемому значению. Функция read не является определенной в классе типов Read. Это некоторая внешняя вспомогательная функция.
Prelude> undefined *** Exception: Prelude.undefined
Функции show, read и reads
Prelude> :t show show :: Show a => a -> String Prelude> show 5 "5" Prelude> show 5.0 "5.0" Prelude> show [1,2] "[1,2]" Prelude> :t read read :: Read a => String -> a Prelude> read "5" :: Int 5 Prelude> read "5" :: Double 5.0 Prelude> read "[1,2]" :: [Double] [1.0,2.0] Prelude> reads "5 rings" :: [(Int, String)] [(5," rings")]
Комментариев нет:
Отправить комментарий