C语言stdlid是什么函数,为什么Curry的std lib中的非确定性选择函数没有直接定义,而是使用辅助2参数函数?...

博客讨论了编程中非确定性函数`choose`的两种不同实现方式,一种是作者的直接定义,另一种是MuensterCurryCompiler中的定义。作者意识到自己的定义可能导致在某些情况下达到未定义值,而编译器的定义则避免了这个问题。两种定义在非空列表上的差异主要在于处理空列表的情况。尽管效率上存在差异,但博主询问是否存在语义上的不同,尤其是在特定的非确定性和未定义值场景下是否重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑一个函数choose在库里的编程语言与"规范(choose xs)的非确定性选择一个元素从列表中xs".

我将通过两个替代的非确定性规则直接实现它:

choose :: [a] -> a

choose x:_ = x

choose _:xs = choose xs

但是在Muenster Curry Compiler的 /usr/lib/curry-0.9.11/Success.curry中,它使用辅助函数定义:

choose (x:xs) = choosep x xs

where choosep x [] = x

choosep x (_:_) = x

choosep _ (x:xs) = choosep x xs

编译器提供的模块定义的优点(如果有的话)是什么?2个定义是否完全等价(即使在一些非确定性和未定义值的棘手情况下)?在某些情况下,其中一个更有效吗?

增加:更深入的考虑

cthom06(谢谢!)已经正确地指出我的定义会导致在更多情况下达到未定义的值(因为我们会尝试使用一个空列表参数调用此函数,每次我们的"顶级"调用一次非空列表参数).(嗯,为什么我没有立刻注意到这个考虑因素?..)效率较低.

但我想知道:有任何语义差异吗?可能在一些棘手的情况下,差异是否重要?

我们看到两个定义之间的差异 - 在非空列表的情况下 - 基本上归结为两个潜在定义之间的差异id:

我的定义就像定义id为:

id x = x

id _ = undefined

他们的定义就像定义id正常的方式:

id x = x

(所以,这里的直截了当还原.)

在哪些情况下它很重要?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值