微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你会如何在 C

如何解决你会如何在 C

我正在尝试学习 C 和 Currying(在前几天学习了一些 Haskell 之后),我想知道是否可以在 C 中做类似的事情。

这纯粹是“为了好玩”,我看过 GCC,发现它支持嵌套函数(非标准),所以想知道这种方法是否可行。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

uint32_t (*addCur(uint32_t ad))(uint32_t ad) {
    uint32_t add(uint32_t to) {
        return ad + to;
    }
    return add;
}

int main(int argc,char **argv) {
    uint32_t a = 1,b = 2;

    if(argc > 1)
        a = atoi(argv[1]);
    if(argc > 2)
        b = atoi(argv[2]);

    uint32_t result = addCur(a)(b);
    printf("result: %d\n",result);

    return 0;
}

什么时候运行会给我想要的效果

./Currying 5 7
result: 12

我想做的是实现一个“乘加”方法。所以本质上有三个嵌套函数,其中每个函数都返回函数,但将必要的作用域留给适当的变量。

I.E.在 JavaScript 中,您可以执行以下操作:

let multiplyAndAdd = (x) => (y) => (z) => (x*y) + z;
multiplyAndAdd(3)(4)(5);

得到 17。

解决方法

这就是我一直在寻找的答案。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

/* Type defining the function returns */
typedef uint32_t (*addCur)(uint32_t ad);
typedef addCur (*multiply)(uint32_t m);

multiply multiplyAndAdd(uint32_t x) {
    addCur doMultiply(uint32_t m) {
        uint32_t mx = m*x;

        uint32_t doAdd(uint32_t c) {
            return mx + c;
        }

        return doAdd;
    }

    return doMultiply;
}

int main(int argc,char **argv) {
    uint32_t a = 4,b = 5,c = 6;

    if(argc > 1)
        a = atoi(argv[1]);
    if(argc > 2)
        b = atoi(argv[2]);
    if(argc > 3)
        c = atoi(argv[3]);

    uint32_t result = multiplyAndAdd(a)(b)(c);
    printf("result: %d\n",result);

    return 0;
}

它有助于类型定义每个方法的返回类型。这使方法更易读。反过来,这让我可以更轻松地链接每个方法的返回。

正如评论中所提到的,这是一个潜在的危险代码,因为无法保证在函数返回时堆栈分配的函数甚至会存在。但我只是对在理论上是否可以在没有大量代码的情况下完成的前景感到沉思。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。