1

有了这个定义:

member _ [] = False
member x (h:t) = if x == h then True else member x t

PAKCS 2.0.1(来自 Ubuntu 18.04)没有给出答案、警告或错误:

    Top-level binding with no type signature:
      member :: Prelude.Eq a => a -> [a] -> Prelude.Bool
member> member x [1, 2, 3] =:= True where x free
member> 

我希望看到 3 个值。我在这里做错了什么?

4

2 回答 2

2

<smap.informatik.uni-kiel.de/smap.cgi?75> 程序只给出了一个解决方案,因为规则

member x (h:t) = if x =:= h then True else member x t

与列表的第一个元素统一x并产生True,仅此而已。请注意,这(=:=)是一个统一约束而不是布尔测试。这意味着x =:= 1绑定x1(为了满足约束)并产生True但从 False。因此,2 =:= 1只是失败而不是屈服False。另一方面,2 == 1产量False。因此,您可能期望x == 1绑定x1yieldingTrue或绑定x2, 3, 4,... yielding False实际上,在 Curry 实现KiCS2中就是这种情况,但 PAKCS 由于某种原因受到更多限制,因此它在此表达式上挂起。

进一步说明:可以将其视为可以在仅需要结果的情况下使用(=:=)的优化,例如在规则条件下。因此,较新的 PAKCS 实现在这种情况下会自动转换为,因此只能在源程序中使用。更多细节可以在这篇论文中找到。(==)True(==)(=:=)(==)

于 2021-01-20T17:51:56.910 回答
1

似乎在Curry编程语言中,==并不是一种可以统一非确定值的函数。

用恰好安装在我的系统上的另一个 Curry 实现做一些实验(curry-0.9.12-alt1.dev20141223.x86_64):

Prelude> (x == 'a') =:= True where x free
Suspended
Prelude> let match_a 'a' = True in match_a x =:= True where x free
{x = 'a'}
Prelude> 
于 2020-12-28T23:45:09.317 回答