根据Harper(https://existentialtype.wordpress.com/2011/04/16/modules-matter-most/),似乎Type Classes根本没有提供与Modules提供的相同级别的抽象,而我正在拥有很难确切地弄清楚原因.并且在该链接中没有示例,因此我很难看到关键差异.还有其他关于如何在模块和类型类之间进行翻译的论文(http://www.cse.unsw.edu.au/~chak/papers/modules-classes.pdf),但这对于从程序员的角度来看实现(它只是说没有人可以做的事情,另一个人无法模仿).
具体来说,在第一个链接中:
首先,他们坚持认为类型可以完全以一种方式实现类型类.例如,根据类型类的哲学,整数可以以一种方式(通常的顺序)排序,但显然有许多有趣的排序(例如,通过可分性).第二个问题是它们混淆了两个不同的问题:指定类型如何实现类型类,以及指定在类型推断期间何时应该使用这样的规范.
我也不明白.一个类型可以在ML中以多种方式实现类型类?如果不创建新类型,您将如何通过示例按可分性排序整数?在Haskell中,您必须执行诸如使用数据之类的操作,并instance Ord提供替代排序.
第二个,不是两个在Haskell中是截然不同的吗?指定"何时应在类型推断期间使用此类规范"可以通过以下方式完成:
blah :: BlahType b => ...
Run Code Online (Sandbox Code Playgroud)
其中BlahType是在类型推断期间使用的类而不是实现类.然而,"类型如何实现类型类"是使用完成的instance.
有人可以解释链接真正想说的内容吗?我只是不太明白为什么模块比Type Classes更少限制.
我想向初学者宣传OCaml,我正在寻找英语的好教程; 不仅仅是你听说过,而是你实际上已经尝试并发现有用......
我开始学习函数式编程语言Haskell,ML大多数练习都会展示如下:
foldr (+) 0 [ 1 ..10]
Run Code Online (Sandbox Code Playgroud)
这相当于
sum = 0
for( i in [1..10] )
sum += i
Run Code Online (Sandbox Code Playgroud)
所以这让我想到为什么编译器不能知道这是算术级数并使用O(1)公式来计算?特别是对于FP没有副作用的纯语言?这同样适用
sum reverse list == sum list
Run Code Online (Sandbox Code Playgroud)
给定一个+ b = b + a和反向定义,编译器/语言可以自动证明吗?
是o组合物操作者(例如val x = foo o bar,其中foo和bar是两个功能),仅在单参数的函数和/或功能可用与参数相等数量?如果没有,是什么,比如说,组成语法foo(x,y)用bar(x).
我意识到这可能是一个愚蠢的问题,但......
如果我链接了一堆let里面做陈述并不需要知道对方的价值观,是它更好地使用and或in?
例如,如果有的话,哪一个更可取:
let a = "foo"
and b = "bar"
and c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
要么
let a = "foo" in
let b = "bar" in
let c = "baz"
in
(* etc. *)
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,前者应该"更好"(通过对"更好"的非常小的定义),因为它创造了必要的最小范围,而后者是范围内的范围.编译器/解释器注意的范围,但最终是不重要和不必要的深度.
我已经看到了教会Rosser定理的多个参考,特别是钻石属性图,同时学习函数式编程,但我没有遇到过一个很好的代码示例.
如果像Haskell这样的语言可以被视为一种lambda演算,那么必须能够使用语言本身来演示一些例子.
如果示例轻松地显示步骤或减少如何导致易于并行执行,我会给予奖励积分.
我知道分号在REPL中用作终结符.但我很困惑何时在源文件中使用它们.
例如,之后没有必要val x = 1.但如果我之后省略它use "foo.sml",编译器会抱怨它.
那么,使用分号的规则是什么?
有一个全新的"函数式编程"范式,与程序式编程相比,需要彻底改变思维模式.它使用更高阶函数,纯度,monad等,我们通常在命令式和面向对象语言中看不到它们.
我的问题是这些语言的实现与命令式或面向对象语言的区别在于,例如,内存管理或内部指针等.
有一些函数语言在JVM之上运行.这是否意味着这些语言在内部像JVM上的其他语言一样工作?
- 关于交互式顶层和图形UI编程的几个问题:
是否可以从ocaml toplevel动态构建图形界面?
也可以使用图形库吗?
标准ML中的函数与模块系统相关,并且可以基于其他结构生成结构.下面给出了为各种类型的列表生成列表组合器的仿函数的示例,但是此示例存在一个问题:
各种类型的列表都具有优势 - 例如,惰性列表可以无限长,并且concantenation列表具有O(1)concat运算符.但是当所有这些列表类型符合相同的签名时,仿函数只能使用它们的常规属性.
因此,我的问题是:什么是一个很好的例子,当函子有用时,各种生成的结构不会失去它们的特殊能力?
signature MYLIST =
sig
type 'a t
val null : 'a t -> bool
val empty : 'a t
val cons : 'a * 'a t -> 'a t
val hd : 'a t -> 'a
val tl : 'a t -> 'a t
end
structure RegularList : MYLIST =
struct
type 'a t = 'a list
val null = List.null
val empty = []
val cons = op::
val hd = List.hd
val tl …Run Code Online (Sandbox Code Playgroud)