发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
基于这种描述,是无法将 FIX、g 转化为 c# 代码的,我们需要推断出 FIX、g 类型。
我们先做一些假定,基于假定进行推导,得出结论再抽象为通用类型。
对于常见的递归函数,如:阶乘、斐波那契数列求值,我们先作如下假定:
根据上篇文章中的描述:
1
2
FIX g = λn. (ISZERO n) 1 (MULT n ((FIX g) (PRED n)))
FIX g 5 = 5 * (4 * (3 * (2 * (1 * 1))) = 120
FIX g 返回的是我们需要的递归函数,这个递归函数
因此,确定出 FIX g 的类型可表示为 Func<int, long>。
同时也能看出 n 是递归函数的参数,n 类型为 int。
阶乘单步函数如下:
g = λf. λn. (ISZERO n) 1 (MULT n (f (PRED n)))
c# 中可表达为:g => f => n => n == 0 ? 1 : n * f(n – 1)
先来推断 f 的类型:
可确定 f 类型为 Func<int, long>。
n => n == 0 ? 1 : n * f(n – 1) 是传入一个 int 返回一个 long,其类型 Func<int, long>。
先来变换下 g 的表示形式:
1 2 3 4 5
var g = (Func<int, long> f) => { Func<int, long> t = n => n == 0 ? 1 : n * f(n - 1); return t; }; // 示意代码
从上面这段代码可以清楚到看出 g 接收一个 Func<int, long> 类型的参数 f,返回一个类型为 Func<int, long> 的委托,可得出:
g 的类型为 Func<Func<int, long>, Func<int, long>>
FIX g 可写作 FIX(g),可以看出: FIX g 的类型 == FIX(g) 的类型 == FIX 返回值的类型。前面得知 FIX g 类型为 Func<int, long>,也就可推出 FIX 返回值类型为 Func<int, long>。
FIX 接受 g 作为参数,FIX 的参数类型也就是 g 的类型,可知 FIX 参数类型为 Func<Func<int, long>, Func<int, long>>。
由此得出 FIX 的类型为:Func<Func<Func<int, long>, Func<int, long>>, Func<int, long>>。
(估计这是多数开发人员见过的最复杂的泛型了。后面还在更复杂的吆!)
基于以上部分的推演和小结,我们可以归纳出通用类型:
基于本文推断出的类型,不动点组合子转换为 c# 代码了不容易多了。下一篇文章将以 Y 组合子为例进行说明。
-------------------
思想火花,照亮世界
来自: 昵称10504424 > 《C#》
0条评论
发表
请遵守用户 评论公约
C++构造函数和析构函数
C++构造函数和析构函数。④构造函数返回一个类的对象。⑤如果一个构造函数没有参数,这个构造函数叫“默认构造函数”。②用对象做函数的参数传值的时候,或者函数返回一个对象值时调用拷贝构造函数;如...
C语言学习:C语言中指针函数与函数指针的详解
C语言学习:C语言中指针函数与函数指针的详解。不少人在学习C语言的过程中总是会把“指针函数”与“函数指针”搞混淆,为了让大家更好的去理解这两者之间的区别,今天在这里整理了C语言中指针函数与函...
Component之Kernel Shell的命令
long sp(FUNCPTR func,long arg1,…,longarg9) - 启动一个Task,等价于taskSpawn(NULL,SHELL_SPAWNED_TASK_PRIORITY,SHELL_SPAWNED_TASK...
C语言函数知多少
比如库函数是系统自带的“库”,回调函数用于处理操作系统的问题,API函数叫做应用程序接口函数。一个函数有函数名、函数的返回值及返回值的类型、函数的参数及参数的类型。函数原型能告诉编译程序一个...
C++ TEMPLATE 学习笔记
1.函数模板:例:template<class T> compare( const T &a, const T &b){ }inline 模板函数的声明中inline 要放在<>后,如:template<class T> inline T compare( const T &...
深入剖析C/C++函数的参数传递机制 (转-有修正)作者:leeyeafu(明经CAD社区 编程申请版块 版主) - hairi的专栏
首先,指针变量(包括函数调用时的临时指针变量)在编译和运行时要分配相当于一个int变量的内存空间以存放指针变量的值,尽管这个值表示的是指针指向的变量的地址。在分析Func2()函数时应该注意到,临时...
typedef 函数指针的用法(附例子) - 渐入魔境 - JavaEye技术网站
这种用法一般用在给函数定义别名的时候上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int.//注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看int ad...
深入理解C语言中的函数声明
最后,linux内核中的信号处理函数定义如下:void (*signal(int,void (*)(int)))(int);首先,将上面的函数声明看成这样void (*p)(int);可知,p是一个函数,所以signal函数的返回类型为一个函数指针,指...
函数指针&指针函数
函数指针&指针函数函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针(1) float(**def)[10] def是什么?a后既然有[ ],那么a是数组,而且是包含3个元素的数组。虽然数组a只含...
微信扫码,在手机上查看选中内容