gpt4 book ai didi

scala - 构造函数应用程序列表

转载 作者:行者123 更新时间:2023-12-02 09:37:19 26 4
gpt4 key购买 nike

我有一个 Haskell 函数,我想将其转换为 Scala。 Haskell 函数是:

valid3 :: (Bool -> Bool -> Bool -> Bool) -> Bool
valid bf = and [bf p q r | p <- [True, False],
q <- [True, False],
r <- [True, False]]

'valid3' 是一个高阶函数,因为它采用函数作为参数。它作为参数的函数接受三个 bool 变量并返回一个 bool 值。最后 valid3 返回一个 bool 值本身。

我尝试将其转换为 Scala,但我对如何在 yield 部分中进行连接感到困惑。这是我到目前为止所拥有的(这不能按原样编译):

def valid3 (bf : (Boolean, Boolean, Boolean) => Boolean) : Boolean = {
for (i <- List(true, false);
j <- List(true,false);
k <- List(true,false)) yield bf(i,j,k)
}

我不确定我在 Scala 中是否正确地处理了这个问题。任何有关如何在惯用的 Scala 中执行此操作的提示也将不胜感激。

最佳答案

您的 for 理解会返回一个列表,以便您可以将 forall 用于 and:

def valid3 (bf : (Boolean, Boolean, Boolean) => Boolean) : Boolean = {
val results = for (i <- List(true, false);
j <- List(true,false);
k <- List(true,false)) yield bf(i,j,k)
results.forall(identity)
}

如果您不需要中间变量,可以使用:

def valid3 (bf : (Boolean, Boolean, Boolean) => Boolean) : Boolean = {
(for (i <- List(true, false);
j <- List(true,false);
k <- List(true,false)) yield bf(i,j,k))
.forall(identity)
}

forall 采用谓词,如果该谓词对于列表中的每个元素都为 true,则返回 true。 Haskell 中对应的函数是 all,其类型为 (a -> Bool) -> [a] -> Bool。如果您想在任何列表元素的谓词为 true 时返回 true,您可以使用 exists 例如

results.exists(identity)

这对应于 Haskell 函数any。据我所知,Scala 中没有直接对应的 andor 函数来操作 Boolean 列表,但您可以轻松定义它们:

def or(s: GenTraversableOnce[Boolean]) = s.exists(identity)
def and(s: GenTraversableOnce[Boolean]) = s.forall(identity)

关于scala - 构造函数应用程序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24187725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com