V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Znella
V2EX  ›  问与答

请教 柯里化 的作用

  •  
  •   Znella · 2022-10-06 14:38:32 +08:00 · 1984 次点击
    这是一个创建于 787 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因:函数式编程的讨论,看到众多大佬讨论函数式编程的优劣。忽然想到自己最近看 axios 源码中的例子,在判断类型时用了柯里化的技巧。

    
    const kindOf = (cache => thing => {
    
    	const str = toString.call(thing);
    
    	return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
    
    })(Object.create(null));
    
      
    
    const kindOfTest = (type) => {
    
    	type = type.toLowerCase();
    
    	return (thing) => kindOf(thing) === type
    
    }
    
    const isDate = kindOfTest('Date');
    
    

    想请问大家,这样的技巧有什么 具体 的作用呢?

    11 条回复    2022-10-07 16:07:25 +08:00
    RecursiveG
        1
    RecursiveG  
       2022-10-06 14:55:51 +08:00
    说明需要多个参数的函数的功能也可以只用单个参数的函数实现,作证明的时候方便点。
    写代码里基本用来缩减代码数量(也可能使代码更不可读)。
    和其他程序员交流的时候当吹牛的资本。
    ZE3kr
        2
    ZE3kr  
       2022-10-06 15:17:22 +08:00 via iPhone
    惰性求值可能有一点点用,当然没有 curry 的话也可以套一层 lambda 。总之我一直把多个参数的函数和 curry 当等价的用。curry 甚至还是 SML/NJ 编程语言的一个语法糖,写起来用起来都跟多个参数的函数没区别
    ZE3kr
        3
    ZE3kr  
       2022-10-06 15:18:59 +08:00 via iPhone
    amlee
        4
    amlee  
       2022-10-06 15:28:26 +08:00
    我自己的理解,柯里化是用来改变函数形状,可以方便的 compose/pipe
    Znella
        5
    Znella  
    OP
       2022-10-06 15:53:20 +08:00
    @ZE3kr 谢谢,看完了。总结下来就是:通过削减函数参数的个数,能够让一些可以提前完成的函数得到执行(或者是一些准备工作)。这样看来还是有一些具体作用的。
    Znella
        6
    Znella  
    OP
       2022-10-06 15:55:08 +08:00
    @RecursiveG 哈哈哈,第二点有异议,感觉似乎并不能缩减代码数量,不过不可读是真的不可读哈哈哈。
    Znella
        7
    Znella  
    OP
       2022-10-06 15:55:59 +08:00
    @amlee 多参数的情况下为什么不能 pipe 呢?能给个例子吗?
    amlee
        8
    amlee  
       2022-10-06 16:11:18 +08:00   ❤️ 1
    @Znella https://www.bilibili.com/video/BV1Nu411S7Jy/

    这有函数式编程的课程,讲师是《你不知道 javascirpt 》作者。
    我刷了一遍,挺有收获的。
    有几节讲 arity, curry, pipe/compose
    Znella
        9
    Znella  
    OP
       2022-10-06 16:15:29 +08:00
    @amlee 谢谢 ^ _ ^
    YYYeung
        10
    YYYeung  
       2022-10-06 22:46:22 +08:00
    函数层面的堆积木,不过结果是函数功能越来越单一化
    aguesuka
        11
    aguesuka  
       2022-10-07 16:07:25 +08:00
    纯函数语言里需要柯里化是因为 `foo(a, b)` 可以写成 `foo a b`, 注意语义不是等价的, 前者相当于 `foo (new-Pair(a, b))` 后者相当于 `foo (a) (b)`, 也就是在纯函数语言里, 我们可以用改变语义的代价, 少写括号和逗号. js 不能去括号, 所以不能享受这个优点.

    不过 js 里可以把 `b => foo (a, b)` 写成 `foo (a)` 来精简代码, 然而在纯函数语言里一般提倡写成 `\b => foo a b`.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2610 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:13 · PVG 15:13 · LAX 23:13 · JFK 02:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.