使用Lambda表达式定义(&&)

时间:2017-09-15 01:10:50

标签: haskell lambda

我收到了以下问题:

1

try {
        imageResource = ResourceBundle.getBundle("imagenames");
        String imageListString = imageResource.getString("images");
        imageList = parseList(imageListString);
    } catch (MissingResourceException e) {
        System.err.println("Can't find list of image names.");
        System.exit(-1);
}

我把它写成条件表达式:

True && True = True  
_ && _ = False

2

(&&) a b = if a then  
if b then True else False 
else False 

我把它写成条件表达式:

True && b = b  
False && _ = False

我正在尝试在lambda表达式中为(&&)给出这两个定义,但我不确定从哪里开始或如何做。

2 个答案:

答案 0 :(得分:2)

我不会直接写出答案,因为这似乎是某种作业/作业。所以我只想解释一下lambda是如何工作的。

让我们采取基本的lambda并将其分解: \a b -> a

在箭头的左侧(在本例中为b),我们有参数。这些是传递给lambda的内容。

在箭头的右侧,我们有输出(在这种情况下为a)。所以这个lambda做的是取两个值并给你第一个。

输出可以是任何表达式,例如,如果我们将a和b限制为数字,那么我们可以myLambda = \a b -> a + b,因此myLambda 1 2将输出3。

因此,要将您的定义转换为lambdas,只需使用if then else语句并将其作为lambda中箭头后面的表达式。

您还可以使用您提供的初始定义中使用的模式匹配,并将其转换为带有case of语句的lambda。这将取caseof之间的值,然后根据值的大小提供各种表达式。

case a of
    True -> something1
    False -> something2

所以把它放在一个lambda会给你:

\a b -> case a of
    value1 -> something1
    value2 -> something2

为了完整起见,我将提到有一个LambdaCase语言扩展,允许您简化:

\a -> case a of
    value1 -> something1
    value2 -> something2

\case
    value1 -> something1
    value2 -> something2

但这不是必要的,我当然不会担心它是初学者。

我希望这有帮助,请随时要求澄清:)

答案 1 :(得分:1)

一般来说,如果

foo bar baz = quux

然后是两个定义

foo = \bar baz -> quux -- OR
foo = \bar -> \baz -> quux

与原始版本完全相同(通过提供明确的类型签名,可以解决一些语言瑕疵)。您可以选择自己喜欢的任何一个。所以,

(&&) a b = if a then b else False

也可以写成:

(&&) = \a b -> if a then b else False

你能解决如何按照同样的模式做另一个吗?