我收到了以下问题:
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表达式中为(&&)给出这两个定义,但我不确定从哪里开始或如何做。
答案 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。这将取case
和of
之间的值,然后根据值的大小提供各种表达式。
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
你能解决如何按照同样的模式做另一个吗?