【发布时间】:2012-03-22 22:14:51
【问题描述】:
我想定义似乎需要无限类型的东西。
必需:一个函数“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 中是否可行。 (用什么论据来证明这是不可能的?)
更新:如以下解决方案所述,编译时需要类型信息,以便编译器可以知道“eat foldl 3 foldl”是否无效。所以,这个问题的精确解决方案是不可能的。
【问题讨论】: