lamdba算子4:布尔值和选择

Lambda算子里的布尔值和选择

原文在这里。既然Lambda算子里有了数的概念我们想进行任意的计算就只需要两件东西了:怎么表示选择,和怎么表达重复操作。我们先聊聊怎么表示布尔值(也就是非真即假的二元集合)和选择,然后再讨论重复和递归(友情预告:人见人爱的Y Combinator终于可以出场了)。

 

我们一般把选择表示为if/then/else的表达式,和大多数编程语言的选择语句没有区别。丘齐数的基本模式无非是把一个数表达为一个函数。这个函数把它自己加到另外一个函数上。我们继续沿用这个模式,把true和false也表达为对自己的参数执行if-then-else操作的函数:
let TRUE = lambda x y . x
let FALSE = lambda x y . y

现在我们就可以写“if-then-else”函数了(记到哈,lambda算子理论里所有东东都是函数)。这个函数的第一个参数是一个条件表达式,第二个参数是当第一个参数为真时返回的表达式,而第三个参数自然是当第一个参数为假时返回的表达式了。相当于我们的if cond then true_expr else false_expr:
let IfThenElse = lambda cond true_expr false_expr . cond true_expr false_expr

为了我们刚定义的布尔值有用,我们还得定义一些常用的逻辑操作先:
let BoolAnd = lambda x y . x y FALSE
let BoolOr = lambda x y. x TRUE y
let BoolNot = lambda x . x FALSE TRUE

上面定义了常用的“与”,“或”,和“非”操作。我们可以稍微考查一下它们的机制。

BoolAnd TRUE FALSE (也就是 true && false):

我们把TRUE和FALSE替换为它们的定义:  BoolAnd (lambda x y . x) (lambda x y . y)
执行Alpha 替换避免混淆变量名:BoolAnd (lambda xt yt . xt) (lambda xf yf . yf)
然后把BoolAnd替换为它的定义:(lambda x  y . x y FALSE)(lambda xt yt . xt) (lambda xf yf . yf)
执行Beta替换:(lambda xt yt . xt) (lambda xf yf . yf) FALSE
呵呵,再Beta一把:(lambda xf yf . yf)。

最后的结果lambda xf yf . yf就是FALSE的定义。也就是说, BoolAnd TRUE FALSE = FALSE。神奇吧?看起来只是简单的替换:变量替换,参数替换,但最后的结果确意义重大。这让我想起当年第一次读
GEB时不由自主地感叹,看似简单的句法层面的操作竟然能得出迷幻般的结果。

我们再来看看 false && true, 也就是 BoolAnd FALSE TRUE。“噫,那不是和我们刚推演过的BoolAnd TRUE FALSE一样么!”。眼尖的老大们可能要问。嗯,我们知道布尔逻辑里的操作是服从交换率的,所以 a && b 等于 b && a。可惜我们在用lambda算子定义布尔操作,是不是服从交换率,需要我们证明。如果BoolAnd FALSE TRUE的结果是FALSE,我们也就证明了BoolAnd符合交换率:
定义替换:BoolAnd (lambda x y . y) (lambda x y .x)
Alpha替换:
BoolAnd (lambda xf yf . yf) (lambda xt yt . xt)
替换BoolAnd的定义: (lambda x y .x y FALSE) (lambda xf yf . yf) (lambda xt yt . xt)
Beta替换: (lambda xf yf . yf) (lambda xt yt . xt) FALSE
再来Beta替换: lambda xt yt. xt, 也就是FALSE
所以说, BoolAnd FALSE TRUE = FALSE

最后,我们来看看BoolAnd TRUE TRUE:
定义替换:BoolAnd (lambda x y . x) (lambda x y . x)
Alpha替换: BoolAnd (lambda xa ya . xa) (lambda xb yb . xb)
替换BoolAnd的定义: (lambda x y . x y FALSE) (lambda xa ya . xa) (lambda xb yb . xb)
Beta替换: (lambda xa ya . xa) (lambda xb yb . xb) FALSE
再次Beta替换: (lambda xb yb .xb),这个正是TRUE的定义
所以我们得到BoolAnd TRUE TRUE = TRUE

 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用Lambda表达式来获取BigDecimal集合中的最大值,具体实现方式如下: ```java List<BigDecimal> list = Arrays.asList(new BigDecimal("1.2"), new BigDecimal("3.4"), new BigDecimal("2.9")); BigDecimal max = list.stream().max(BigDecimal::compareTo).get(); System.out.println("最大值为:" + max); ``` 这段代码中,首先将BigDecimal类型的元素放入List集合中,然后使用stream()方法将其转化为Stream流,再使用max()方法获取最大值,最后使用get()方法取出最大值并输出。 ### 回答2: 使用Lambda表达式获取BigDecimal集合的最大值可以通过以下步骤实现: 1. 首先,创建一个包含BigDecimal类型元素的集合,例如List<BigDecimal>。 2. 然后,使用Lambda表达式中的max()方法来获取集合中的最大值。 3. 在max()方法中,使用Comparator.comparing()方法来比较BigDecimal类型的元素。 4. 在Comparator.comparing()方法中,使用BigDecimal的compareTo()方法来进行比较,以确定最大值。 5. 最后,将返回的最大值保存在一个新的BigDecimal变量中,或者根据需要进行进一步处理。 以下是一个简单的示例代码: List<BigDecimal> numbers = new ArrayList<>(); numbers.add(new BigDecimal("10.5")); numbers.add(new BigDecimal("20.3")); numbers.add(new BigDecimal("15.7")); BigDecimal max = numbers.stream() .max(Comparator.comparing(BigDecimal::valueOf)) .orElse(BigDecimal.ZERO); 上述代码中,我们首先创建一个包含BigDecimal类型元素的集合numbers。然后,使用stream()方法将其转换为流,使用max()方法获取最大值,并使用Comparator.comparing()方法根据BigDecimal的值进行比较。最后,通过使用orElse()方法指定默认值,以防集合为空。 这样,变量max将保存集合中的最大BigDecimal值。根据实际需求,您可以自行调整代码。 ### 回答3: 要使用lambda表达式获取BigDecimal集合的最大值,我们可以按照以下步骤进行操作: 1. 首先,创建一个BigDecimal类型的集合,可以使用ArrayList或者其他实现了List接口的集合类。 2. 使用lambda表达式来比较集合中的元素,并找到最大值。可以使用Collections类的max方法来实现。 3. 创建一个Comparator对象,该对象实现了Comparator接口,并重写compare方法。在compare方法中,比较两个BigDecimal对象的大小。 4. 调用Collections类的max方法,传入集合和Comparator对象作为参数,即可获取到集合中的最大值。 以下是一个示例代码: ```java import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Main { public static void main(String[] args) { List<BigDecimal> bigDecimalList = new ArrayList<>(); bigDecimalList.add(new BigDecimal("10.5")); bigDecimalList.add(new BigDecimal("20.3")); bigDecimalList.add(new BigDecimal("15.7")); BigDecimal max = Collections.max(bigDecimalList, new Comparator<BigDecimal>() { @Override public int compare(BigDecimal o1, BigDecimal o2) { return o1.compareTo(o2); } }); System.out.println("最大值为: " + max); } } ``` 以上代码中,我们创建了一个包含3个BigDecimal对象的集合,然后使用lambda表达式来比较两个BigDecimal对象的大小,最终找到集合中的最大值,并将其打印出来。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值