Haskell "Нет операции"

Если я правильно помню из школы, есть функция или ключевое слово, которое используется для "еще не реализовано", но код компилируется. Я пытался найти его, но не могу найти. Кто-нибудь знает, что я ищу?

это что-то вроде

isDivisor :: Integer -> Integer -> Bool
isDivisor x y = None
--isDivisor x y = (rem x y) == 0

1 ответ

Решение

То, о чем ты думаешь, называется bottom

Дно не только для того, чтобы показать, что что-то не реализовано, оно предназначено для представления вычислений, которые приводят к сбою нашей программы.

Например, мы можем определить undefined мы как бесконечный цикл

undefined = let x = x in x
undefined = undefined

Так что на самом деле мы просто вкладываем в undefined :: a что приведет к аварийному завершению или циклическому сбою или циклу, но никогда не оценивает его.

Поэтому, если у вас есть какая-то большая и сложная функция, которую вы не знаете, как реализовать, вы можете просто сделать это

foo :: Bar -> Baz -> Quux
foo bar baz = foo bar baz

Поскольку этот тип проверяется, он скомпилируется, и мы можем протестировать другие части нашей программы.

Однако, поскольку при случайном запуске этой части программы бесполезно иметь бесконечный цикл, GHC и другие реализуют undefined как по другому. Они заставляют их аварийно завершить работу программы и выдают сообщение об ошибке, например:

-- In GHC
error msg = throw (ErrorCall s)
undefined = error "Prelude.undefined"

Таким образом, чтобы оставить функцию неопределенной с лучшими возможностями отладки

foo bar baz = undefined
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz)

Если вы находите понятие дна непонятным, Hammar опубликовал отличный ответ

Другие вопросы по тегам