23

咖喱教程的第 3.13.3 节:


剩余的操作称为刚性操作,而狭窄的操作称为灵活操作。所有定义的操作都是灵活的,而大多数原始操作,如算术操作,都是刚性的,因为猜测对它们来说不是一个合理的选择。例如,前奏定义了一个列表连接操作,如下所示:

infixr 5 ++
...
(++)             :: [a] -> [a] -> [a]
[]       ++ ys   = ys
(x:xs) ++ ys     = x : xs ++ ys

由于操作“++”是灵活的,我们可以使用它来搜索满足特定属性的列表:

Prelude> x ++ [3,4] =:= [1,2,3,4]       where x free
Free variables in goal: x
Result: success
Bindings:
x=[1,2] ?

另一方面,像加法“+”这样的预定义算术运算是刚性的。因此,使用逻辑变量作为参数调用“+”会失败:

Prelude> x + 2 =:= 4 where x free
Free variables in goal: x
*** Goal suspended!

库里似乎并没有提防写将被暂停的目标。什么类型的系统可以提前检测目标是否将被暂停?

4

1 回答 1

3

您所描述的听起来像模式检查,它通常检查哪些输出可用于一组输入。您可能想要检查非常重视模式检查的语言 Mercury。

于 2011-04-10T09:19:24.930 回答