Преднамеренное определение бесконечности type in haskell

Я хочу определить, что, кажется, требует бесконечного типа.

Требуется: функция "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" недопустимым или нет. Так что точное решение этой проблемы невозможно.

10
задан Karan 5 March 2012 в 13:10
поделиться