gpt4 book ai didi

haskell - 不同 lambda 函数和字符的含义

转载 作者:行者123 更新时间:2023-12-02 18:29:33 26 4
gpt4 key购买 nike

目前我正在学习 Haskell,但我在一些示例的语法上遇到了困难。它们到底是什么意思?

首先:这两个 lambda(->\yy)之间有什么区别?

lambda1 = \x -> \y -> x + y
lambda2 = \x y -> x + y

第二:这是什么意思?这是一个 lambda,充当“伪”列表生成器,生成包含 3 个元素的列表。我怎样才能创建这样的列表?

lambda3 = [\x -> x+1, \x -> 2*x, \x -> x^2]

第三:\_到底是什么意思?

lambda4 = \_ -> (\x -> x+1, \() -> 'a')

最佳答案

lambda2lambda1 的语法糖。所有这些都是等效的:

f = \x -> \y -> x + y
f = \x y -> x + y
f x = \y -> x + y
f x y = x + y
f x y = (+) x y
f x = (+) x
f = (+)

lambda3是数字上的一元函数列表。每个函数的类型为 (Num a) => a -> a ,所以列表的类型为 (Num a) => [a -> a] 。您可以使用 map 生成值列表或列表理解:

fs = [\x -> x+1, \x -> 2*x, \x -> x^2]

map (\f -> f 3) fs
map ($ 3) fs
[f 3 | f <- fs]
==
[4, 6, 9]

lambda4使用模式匹配语法。例如,如果您有一种数据类型:

data Foo = Foo Int String

然后你可以编写一个对其进行模式匹配的 lambda:

f = \ (Foo n s) -> concat (replicate n s)

f (Foo 3 "bar") == "barbarbar"

(但与 case 不同,如果 Foo 有多个构造函数,则无法提供替代模式。)

_模式只是说“接受一个值并忽略它”,所以 lambda4是一个函数,它接受一个参数,忽略它,并返回一对(2元组)一元函数,第一个类型为 (Num a) => a -> a第二个类型 () -> Char ,所以它的类型是Num a => r -> (a -> a, () -> Char) .

lambda4 = \_ -> (\x -> x+1, \() -> 'a')
lambda4 = \ignored -> (\x -> x+1, \() -> 'a')

(inc, getA) = lambda4 ()
inc 3 == 4
getA () == 'a'

可以使用 const 构造忽略其参数的函数。函数和运算符部分 ( (+ 1) ) 通常优于 lambda ( \x -> x + 1 ),因此您也可以将上面的内容写为:

lambda4 = const ((+ 1), const 'a')

关于haskell - 不同 lambda 函数和字符的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663215/

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