极狐行动2.0首站 快闪店
中国 成都 春熙路步行街 红星广场
时间 2022-06-02 至 2022-06-05
“极狐行动2.0—ARCFOX沉浸式试驾体验营·成都站成为这个端午成都刷爆热搜的网红酷玩IP打卡点。
现场有营内检录区、创意力挑战区、知识力挑战区、勇气力挑战区、智慧力挑战区、速度力挑战区六大挑战区。
孵化于元宇宙时代的“沉浸式、剧情化、任务制”漫威式文化IP。打造长达17米的先行者号太空船,将带着联合探险队员一起完成任务探索。任务制方式的体验给玩家带来沉浸式的体验。
剧本杀与快闪店的结合,增强快闪店的内容及趣味性。汽车品牌,通过快闪店本身的互动体验属性增加用户的触达和品牌价值。更多品牌在选择用快闪店的形式发布新品和销售。
#极狐# #快闪店# #快闪# #快闪案例# #Let's pop up#
官方网站:https://t.cn/A62NxXMY
商务合作:400-666-2577
中国 成都 春熙路步行街 红星广场
时间 2022-06-02 至 2022-06-05
“极狐行动2.0—ARCFOX沉浸式试驾体验营·成都站成为这个端午成都刷爆热搜的网红酷玩IP打卡点。
现场有营内检录区、创意力挑战区、知识力挑战区、勇气力挑战区、智慧力挑战区、速度力挑战区六大挑战区。
孵化于元宇宙时代的“沉浸式、剧情化、任务制”漫威式文化IP。打造长达17米的先行者号太空船,将带着联合探险队员一起完成任务探索。任务制方式的体验给玩家带来沉浸式的体验。
剧本杀与快闪店的结合,增强快闪店的内容及趣味性。汽车品牌,通过快闪店本身的互动体验属性增加用户的触达和品牌价值。更多品牌在选择用快闪店的形式发布新品和销售。
#极狐# #快闪店# #快闪# #快闪案例# #Let's pop up#
官方网站:https://t.cn/A62NxXMY
商务合作:400-666-2577
第一次上海尹小格,第二次南京let美人
喜欢偏网红风的鼻子也不一定要去这种渠道Y院吧?还两次都入套,而且这种也不会维q!!!有的还是像之前济南那个那种性质,就真的...
徐刚、李湘原、程军,江宝华,钱玉鑫,金勇圭、欧阳春、张柱允,李桂珍、蒋淼、李月辉、徐晓斐、周兆平、沈国雄,个别注意避雷!想了解的礼貌提问叫兽
喜欢偏网红风的鼻子也不一定要去这种渠道Y院吧?还两次都入套,而且这种也不会维q!!!有的还是像之前济南那个那种性质,就真的...
徐刚、李湘原、程军,江宝华,钱玉鑫,金勇圭、欧阳春、张柱允,李桂珍、蒋淼、李月辉、徐晓斐、周兆平、沈国雄,个别注意避雷!想了解的礼貌提问叫兽
第四天:Kleisli范畴!
OK,之前已经见识过如何使用范畴论对类型和纯函数建模了。那么,如何模拟副作用呢?
我们先看一个例子:日志函数。每执行一个函数,向日志中增加一个记录。
```cpp
string logger;
bool negate(bool b) {
logger += "Not so!";
return !b;
}
```
由于每次调用该函数都会修改全局变量,我们把这种函数叫做有副作用的函数。当然,以上代码也很不符合现代编程规范。不过,只需要加一个参数就可以解决问题。
```cpp
pair negate(bool b, string logger) {
return make_pair(!b, logger + "Not so!");
}
```
把logger作为参数传入,再作为结果输出。但是这个函数很难用,输出的string还比较好处理——忽略即可,但是每次调用都要手动传入一个logger也太麻烦了。我们想用一个”收线盒“把logger这条”数据线“隐藏起来。
首先,我们先把输出包装起来。
```haskell
type Writer a = (a, String)
```
我们不想要输入输入参数中的string,那就先暂时忽略它,此时函数的类型是`a -> Writer b`。接下来我们考虑怎么组合Writer,组合Writer的运算符叫做。
```haskell
(>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
```
函数签名已经描述了它要做的事情:接受两个“包装过”的函数,组合成一个新的“包装”函数。那么鱼应该怎么样实现呢?
```haskell
m1 >=> m2 = \x ->
let (y, s1) = m1 x
(z, s2) = m2 y
in (z, s1 ++ s2)
```
首先将参数x传给m1,此时我们获得了logger s1,但是并不把它作为参数传给m2,而是与m2返回的s2相加,一起返回。那么`m1 >=> m2`返回的日志记录就是`s1 ++ s2`,完美!进一步我们可以发现,s1与s2并不需要是字符串,仅仅满足幺半群的性质即可~
现在,两个“包装”函数可以组合了,根据范畴论的思想,id函数又是什么呢?不过根据经验,id函数总是平凡的。
```
return :: a -> Writer a
return x = (x, "")
```
这种我们编程上的技巧,并不是程序员首先发明的,它叫做Kleisli范畴。Klesli范畴中的对象是程序语言的类型,而态射是装饰过的函数。每一个Kleisli范畴定义了独有的包装函数并组合的方法。上述的叫做writer monad,主要用来追踪函数的执行过程,也是在纯函数中嵌入副作用的一个例子。
现在,数学与程序得到了统一,在寄存器中读写的电路,原来就是Kleisli范畴!
OK,之前已经见识过如何使用范畴论对类型和纯函数建模了。那么,如何模拟副作用呢?
我们先看一个例子:日志函数。每执行一个函数,向日志中增加一个记录。
```cpp
string logger;
bool negate(bool b) {
logger += "Not so!";
return !b;
}
```
由于每次调用该函数都会修改全局变量,我们把这种函数叫做有副作用的函数。当然,以上代码也很不符合现代编程规范。不过,只需要加一个参数就可以解决问题。
```cpp
pair
return make_pair(!b, logger + "Not so!");
}
```
把logger作为参数传入,再作为结果输出。但是这个函数很难用,输出的string还比较好处理——忽略即可,但是每次调用都要手动传入一个logger也太麻烦了。我们想用一个”收线盒“把logger这条”数据线“隐藏起来。
首先,我们先把输出包装起来。
```haskell
type Writer a = (a, String)
```
我们不想要输入输入参数中的string,那就先暂时忽略它,此时函数的类型是`a -> Writer b`。接下来我们考虑怎么组合Writer,组合Writer的运算符叫做。
```haskell
(>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
```
函数签名已经描述了它要做的事情:接受两个“包装过”的函数,组合成一个新的“包装”函数。那么鱼应该怎么样实现呢?
```haskell
m1 >=> m2 = \x ->
let (y, s1) = m1 x
(z, s2) = m2 y
in (z, s1 ++ s2)
```
首先将参数x传给m1,此时我们获得了logger s1,但是并不把它作为参数传给m2,而是与m2返回的s2相加,一起返回。那么`m1 >=> m2`返回的日志记录就是`s1 ++ s2`,完美!进一步我们可以发现,s1与s2并不需要是字符串,仅仅满足幺半群的性质即可~
现在,两个“包装”函数可以组合了,根据范畴论的思想,id函数又是什么呢?不过根据经验,id函数总是平凡的。
```
return :: a -> Writer a
return x = (x, "")
```
这种我们编程上的技巧,并不是程序员首先发明的,它叫做Kleisli范畴。Klesli范畴中的对象是程序语言的类型,而态射是装饰过的函数。每一个Kleisli范畴定义了独有的包装函数并组合的方法。上述的叫做writer monad,主要用来追踪函数的执行过程,也是在纯函数中嵌入副作用的一个例子。
现在,数学与程序得到了统一,在寄存器中读写的电路,原来就是Kleisli范畴!
✋热门推荐