Я хочу определить, что, кажется, требует бесконечного типа.
Требуется: функция "eat", которая съедает все свои аргументы, кроме "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"
Это нормально работает для «съешь 6», но не для «съешь 6 7», и это не сработает, если я поставлю (eat 3 = 3) в его определении.
Я не уверен, возможно ли это вообще в Haskell. (Какой аргумент можно использовать, чтобы показать, что это невозможно?)
ОБНОВЛЕНИЕ: Как указано в решении ниже, информация о типе необходима во время компиляции, чтобы компилятор мог узнать, является ли "съесть foldl 3 foldl" недопустимым или нет. Так что точное решение этой проблемы невозможно.