Я хочу определить, что, как представляется, требует бесконечного типа.
Требуется: функция "есть", которая ест все ее аргументы, кроме "3", для которых она возвращает 3
eat 3 = 3
eat x = eat
Таким образом, в основном произвольное выражение типа "eat (+) foldl (Just 5) 3" оценивается до 3. Но проблема здесь в том, что есть еда. Что это должно быть?
Ближайший я получил к запущенному коду:
newtype Rec = MakeRec (Int -> Rec)
eat :: Int -> Rec
eat x = MakeRec eat
instance Show Rec where
show _ = "EAT"
Это работает нормально для "eat 6", но не для "eat 6 7", и это не работает, если я ставлю (ем 3 = 3) в нем определение.
Я не уверен, возможно ли это в Haskell. (Какой аргумент можно использовать, чтобы показать, что это невозможно?)
ОБНОВЛЕНИЕ: Как указано ниже, информация о типе необходима во время компиляции, чтобы компилятор мог знать, является ли "eat foldl 3 foldl" недопустимым или нет. Таким образом, точное решение этой проблемы невозможно.