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 опубликовал отличный ответ