游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6931|回复: 21

lambda表达式

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2009-8-19 23:55:00 | 显示全部楼层 |阅读模式
delegate int del1(int x, int y);
delegate int del2(int x);
delegate del2 del3(del1 f, int y);
private void button1_Click(object sender, EventArgs e)
{
     del1 f1 = (a, b) => a + b;
     del3 curry = (f, a) => (b) => f(a, b);
     del2 f2 = curry(f1, 1);
}

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-20 00:05:00 | 显示全部楼层

Re:lambda表达式

上面我们通过手工方法实现了currying,
实际上F#中直接支持currying:

let f = fun a b -> a + b
let g = f 1
let y = g 10

这相当于

let f = fun a b -> a + b
let curry = fun f a -> fun b -> f a b
let g = curry f 1
let y = g 10

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-20 00:08:00 | 显示全部楼层

Re:lambda表达式

以上我们同时展示了
  lambda表达式
  currying

实际上,如果不是必须要用lambda表达式,则我们的F#代码更简洁:

let f a b = a + b
let g = f 1
let y = g 10

这相当于

let f a b = a + b
let curry f a = fun b -> f a b
let g = curry f 1
let y = g 10

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-20 17:34:00 | 显示全部楼层

Re:lambda表达式

希望VB9.0爱好者积极发关于lambda的帖。
其实,(虽然比不上专业的函数性语言F#)VB中的lambda表达式语法比C#的更好用。

Dim f1 = Function(a, b) a + b
Dim curry = Function(f, a) Function(b) f(a, b)
Dim f2 = curry(f1, 1)

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2009-8-20 19:17:00 | 显示全部楼层

Re: lambda表达式

[em4] [em4] [em4]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-27 02:47:00 | 显示全部楼层

Re:lambda表达式

还有个更过瘾的:
let y = (fun x -> 10.0*x)(0.5)

如果你看不懂,那么改写下:
let f = fun x -> 10.0*x // 相当于 let f x = 10.0*x
let y = f(0.5)

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2009-8-27 12:08:00 | 显示全部楼层

Re:lambda表达式

空 想 家

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-28 01:07:00 | 显示全部楼层

Re:lambda表达式

let f a b = a * b
let y = f 1 2
let y' = (f 1) 2
//请注意, f 1 2 和 (f 1) 2 的浅层语义是不同的。
//后者表示 (fun b -> f 1 b) 2, 换言之:
let tmp b = f 1 b
let y'' = tmp 2


let g a b c = a * b * c

let z1 = g 1 2 3
let z2 = (g 1) 2 3
let z3 = (g 1 2) 3
let z4 = ((g 1) 2) 3
// z1 = z2 = z3 = z4

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-8-28 01:08:00 | 显示全部楼层

Re:lambda表达式

open System
open System.Windows.Forms

let 高い sub = fun sub2 -> MessageBox.Show(sub2 + "の" + sub + "が高い")

let tmp = (高い "背") "太郎"

//?gは、'高い'が引数が一つしかなくても、こう??い皮猓希耍
let tmp' = 高い "背" "太郎"

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2009-8-28 10:20:00 | 显示全部楼层

Re:lambda表达式

你应该去教日文
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 15:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表