- 博客(22)
- 收藏
- 关注
原创 Modules模块NamespaceManagement命名空间管理
Signatures, 在SML里Signature是structure模块的类型,有点类似于定义接口,具有隐藏代码的作用。使用该行代码后,后面的代码访问Module内的内容,可以不需要带上模块名。不推荐在实际运行的代码中这么做。大部分程序语言都有组织大型程序的方式。如将代码分开放到不同文件中,对外隐藏内部代码。更好的方法是生成一个local绑定,如 val map = List.map.有一种方法可以直接访问Module的绑定。SML定义module。
2025-04-11 14:49:17
234
原创 Type Inference类型推断
(abs y) + z (* abs 函数类型是int -> int, 求一个int整数的绝对值, +左右两边是整数int, 所以y, z是int类型,x是(int, int), 函数f的返回结果是int类型*)为什么有值限制:是因为多态的存在,使有些不该类型检查通过的地方类型检查通过了,比如存在一些应该放类型t2的地方,允许了放t1类型。ML的type system类型系统是不完善的,存在一些应该放类型t2的地方,允许了放t1类型。比如下面这段代码在静态类型语言中会报错,在动态类型语言中可以可以运行。
2025-04-08 08:54:13
791
原创 标准库文档
SML标准库文档地址:http://www.standardml.org/Basis/manpages.html 或者。2.程序员能自己实现,但是功能非常通用,放在标准库里是适合的,如map, filter方法、字符串的处理。类似于句查看模块内的所有方法。1. 程序员自己不能实现的方法,如打开文件,设置一个定时器,访问网络,输入输出打印。对于任何语言,您都应该熟悉查找文档并获得一些关于在哪里查找的直觉。它被组织成称为结构和签名的东西。这是在使用 ML 的模块系统。它被组织成称为结构和签名的东西。
2025-04-04 08:10:42
272
原创 回调式编程 Callback Style Programming
我们在这里使用的习惯用法是,有人编写了一个库,从客户端接收一些函数,这些函数稍后在发生某种事件时被调用。因此,示例库是控制键盘或鼠标或数据从网络到达时的东西。因此,它们将传递给库的代码,这些代码应在按下键时执行。因此,我们确实需要first class函数,以便我们可以传递一些代码,这些代码稍后在发生事件时被调用。响应式编程也是利用的callback。我们的库将维护回调的可变状态, 一个回调函数的列表,并提供向该可变集合中添加新回调的函数。这种编程方式在苹果系统上的OC语言中是很常见的。
2025-04-03 17:28:30
179
原创 Currying柯里化
fun f x = fn y => fn z => x + y + z, f函数接受参数x, 返回一个函数,这个函数接受参数y,返回一个函数,这个函数接受z, 返回x + y + z表达式的值。类型是 int -> int -> int -> int (等同于int -> (int -> (int -> int))。比如fun f (x, y, z) = x+y+z, 函数f,接受三个参数x, y, z,返回x + y + z表达式的值, 类型是int * int * int -> int。
2025-04-03 15:23:51
1547
原创 Lexical Scope和Closure闭包
说白了,就是函数里,有名函数,匿名函数里的对外部的变量使用是怎么来实现的,就是闭包这个功能帮你存储的,当函数调用的时候,变量就是从闭包里取出来的。(在函数外部定义但在函数内被引用),有些函数也可能没有自由变量。闭包跟函数最大的不同在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即便脱离了捕捉时的上下文,它也能照常运行。可能是因为Lexical Scope和闭包是很自然的事,对于初学者很自然的就觉得应该是这样,函数里使用的变量就应该是定义里或定义附近的,也就是函数定义的环境。
2025-04-03 10:32:38
500
原创 Map和Filter (程序员必须掌握的两个函数)
预定义的函数与我们自定义的可能存在区别,比如SML语言中,map函数的定义使用了currying这个概念, SML中类似上面功能的函数是List.map函数。filter是过滤, 将一个返回bool值的函数,应用于某个集合中的每一个元素,将计算结果为false的元素过滤掉,剩下的元素生成集合。currying通常我们称为柯里化,定义是:是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。map是映射,将相同的函数应用于某个集合中的每个元素以生成相应的集合。
2025-04-02 09:45:07
408
原创 SML匿名函数Anonymous Functions
triple_n_times1里是通过let表达式定义局部函数, triple_n_times2也是通过let表达式定义局部函数,只是直接在传参位置定义的,而triple_n_times3更简单了直接定义了一个匿名函数进行传参数。是可以这样写,和fun triple = 3 *y是一样的效果(可以认为这行代码是前面代码的语法糖),但是我们不推荐这样写,有名函数用fun写风格会更好。定义了一个函数,参数为空,返回类型是一个函数,返回的函数类型是`a list -> int。如果是下面这样写,是什么意思呢?
2025-04-01 15:23:59
462
原创 SML的Functional Programming函数编程
关于一等公民函数、高阶函数、函数闭包、多态这些专业术语,虽然术语很专业,但是一定要理解他们的定义,并不难,一个术语就是一个小点,就死记硬背都是可以的,这些术语很像数学或物理上的公式定理,已经写死在这里了,在写代码中只需要运用这些定理就行。在我实际的编码生涯中,我接触到的很多编码者并没有吃透这些概念,而对这些概念吃透了的人他们的技术能力明显是强大的,编码思维也是更清楚的。注意虽然高阶函数通常是多态的,但高阶函数和多态是两个分开的概念,有高阶函数不是多态的情况,有一阶函数是多态的情况。高阶函数是一个术语。
2025-04-01 12:04:37
419
原创 SML中的异常Exception(其他语言中思想通用)
比如hd [], 从一个空列表里取第一个元素,显然会出错,这是在静态环境里无法检测出来的(编译器检测不出来的),那如何处理呢,肯定是不能正常返回元素的,直接让程序stop也不是一个好的选择,这个时候就可以抛出异常,告诉使用hd []的代码调用有问题,你处理下,如果不处理,这个错误就会往上传递,如果在往上传递的过程中,没有任何代码处理这个异常,那程序就会stop。异常的使用分为抛出(有些代码是raise有些代码是throw)异常和捕获(有些代码是catch有些代码是handle)异常。
2025-03-31 12:25:16
297
原创 SML强大的pattern matching模式匹配功能
模式((a, b), (c, d))::e匹配元素个数>=1的元素类型是((type of a, type of b), (type of c, type of d))的列表。val a::b::c = e,将e表达式计算出来的列表,第一个元素和a绑定,第二个元素和b绑定,剩下元素列表和c绑定。如果模式匹配p是(p1, ..., pn)和v是(v1, ..., vn), 在p1匹配v1, ...pn匹配vn的情况下, p和v匹配成功,如果模式p是一个值x, 匹配一定成功,x绑定值v。
2025-03-31 10:15:57
1703
原创 SML数据类型:基本数据类型、复合数据类型和自定义数据类型
这行代码表示,新生成一个类型mytype, mytype里要么有一个(int * int)类型的值,要么有一个string类型的值,要么有Pizza这个值。tuples就是具有特殊filedName的records, tuples是一种语法糖,能用records的语法语义来描述tuples的语句。REAPL中输出类型的时候, field的name是按字母顺序重新排列后显示的,但是对代码没有任何影响,只是方便展示。还未完成,后续继续写完这三种类型的变量的生成以及options和lists类型是怎么生成的。
2025-03-27 19:09:13
1288
原创 SML的Options
options是SML语言中的一种特性,苹果的Swift语言中也有类似的概念,叫optional可选项, 在swift语言中,如果不是optional值,是不可以赋值nil的,如果是optional值才可以赋值nil,Swift语言的optional概念可能也是借鉴自SML语言中。针对good_max函数,我们希望列表为空的时候,不返回任何东西,列表不为空的时候,返回最大值。检查e的类型为t, SOME e的类型为t options。注意:int option是一种新的类型,和int类型是不同的。
2025-03-25 20:09:28
487
原创 SML的let表达式:定义局部绑定(变量绑定和函数绑定)
之前我们学到的val和fun binding都是对文件里后面的代码都可见的。b1 b2... bn是binding,SML里的binding就是构造变量和函数的代码, e是表达式。按我们之前看到的其他语言,定义函数局部变量,会想到这样去写,以下代码语法是错误的, SML语言不支持这么写。类型检查:bi和e可以使用前面的binding,比如bn可以使用bn-1,这个表达式的返回类型是e的的类型。注意:let是一个表达式,像1, 1 + 1, 条件表达式,这些表达式能用的地方,let表达式也能用。
2025-03-24 19:19:26
503
原创 SML数据类型:Lists列表
2. 很多列表函数并不关心列表里具体元素的类型,如果append_list合并两个列表,但并不关心元素是int类型还是bool类型或者其他更复杂的类型,大部分语言都会支持这种泛型函数功能的,那这种代码在SML里怎么实现呢?所以在hd e和tl e语句之前应该判断e是否为空列表,SML提供了判断e是否为列表的标准function, null e (通过REPL环境可以看到null在SML中是一个函数, 参数类型是'a list)。访问除第一个元素的后续元素列表: tl e, tl是tail的缩写。
2025-03-24 17:09:23
643
原创 SML的数据类型:Tuples组合
注意:在函数定义或调用的时候,传递的参数是pairs(可类推到tuples)时, 调用和调用两个参数函数代码一摸一样,那ML是如何区分的呢,其实ML里这两个东西是一样的,不做区分。Lists(列表):(t1, t2, t3... tn), t1, t2...有相同的数据类型,n数字不固定,运行过程中可增减。类型检查:e1的类型为t1, e2的类型为t2,pair类型为t1 * t2, 为一种新的类型。如val x = ((3, 5), ((4, 8), (0, 0)), bool)语法: (e1, e2)
2025-03-23 16:08:40
355
原创 SML函数function
表达式类型检查 (里面包含使用前面变量类型的检查,参数类型检查,递归调用函数类型的检查),得出函数变量的类型(返回类型是类型检查推导出来的,不需要指定返回类型)2.参数类型可以不指定,能产生泛型效果(泛型指定义时不指定具体参数类型,直到时候才确定)。evaluation计算规则:一个函数就已经是一个值,不需要计算,函数调用的时候才会计算。在sml REPL里pow是一个函数类型,带有传递参数类型和返回参数类型的函数。sml中函数是一等公民,变量能做的事函数也能做,这也是函数编程的精髓。
2025-03-23 14:05:43
362
原创 SML的shadowing(变量遮蔽)
SML语言中是不允许改变变量的值,也就是不存在赋值语句。(每种语言有各自的语法和特性)但是支持相同变量的再次绑定,如。SML语言中不允许向前引用。
2025-03-21 17:04:14
260
原创 Emacs的REPL--sml代码的运行
对于任何一种编程语言,除了需要了解如何编写外,还需要了解如何运行以及解决运行中出现的错误(也就是调试)。Evaluation计算错误:要么产生一个错误的结果(程序逻辑错误),异常错误(链接错误等),无限循环。type-checking类型检查错误:编译阶段检测(没有找到对应的类型,表达式里的类型不对等等)。在REPL环境下可以直接编码运行,也可以使用use filename.sml来运行文件中的代码。1. 不知道为什么程序运行错误,特别是程序逻辑上的错误,编译运行报的错误对此没有帮助。调试来解决上述问题。
2025-03-21 15:38:17
325
原创 SML表达式的规则
每个值有固定对应的类型,如32为int, true为bool, ()为unit。表达式:常量(如整数42), 变量、加减运算、if条件、大于等于小于逻辑运算、函数调用等。变量名称需要遵守名称规则:字母、数字和下划线组成,但不以数字开头。如果e2计算结果为false, 则返回e3计算结果。如果e1计算结果为true, 则返回e2计算结果。所有的值都是表达式,如32, true, ()e2和e3计算结果为同一个类型。每个表达式都有语法、类型检查规则和计算规则。检查类型,不存在,则报错。其他表达式可类似书写。
2025-03-21 12:54:58
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅