Haskell:获取字符串表示/模式匹配而不评估整数

sin*_*ohn 1 haskell

我有一个功能func,需要一个Integer.如何识别传递给的Integer是否func^?组成?如果整数由大数组成,比如说200 ^ 350,我不想评估整数.这是一个伪Haskell代码:

func :: Integer -> Integer
func x = case x of (a ^ b) -> func1 a b
                   otherwise -> func2 x
Run Code Online (Sandbox Code Playgroud)

func可称为func (200^350)func 25

dfe*_*uer 7

你不能.像大多数编程语言一样,Haskell在概念上通过值†而不是表达形式将参数传递给函数.An Integer只是一个GMP bignum--一组表示二进制编码中的整数的比特‡.当你将一个函数传递给函数时,它绝对无法知道它的来源或构造方式.您可以做的是检查它并确定它是否太大而无法显示.

funkyfunk a
  | a > 10^(30 :: Int) = func1 a
  | otherwise          = func2 a
Run Code Online (Sandbox Code Playgroud)

†Haskell实际上使用了需求评估模型的调用,但这种区别在这里并不重要.

‡小Integer值实际上是以不同的方式表示的,但即使你足够愚蠢地挖掘内部细节,这也无法帮助你.