我将要教授离散结构的低年级课程。我之所以选择教科书“离散结构,逻辑和可计算性”,部分原因是它包含有助于使用功能性编程语言实现的示例和概念。(我也认为这是一本好教科书。)
我希望使用一种易于理解的FP语言来说明DS概念并供学生使用。大多数学生充其量只用Java进行一两个学期的编程。在查看了Scheme,Erlang,Haskell,Ocaml和SML之后,我选择了Haskell或Standard ML。由于以下原因,我倾向于Haskell,但我希望那些积极参与其中的程序员的意见。
- Haskell和SML都具有模式匹配,这使得描述递归算法变得很困难。
- Haskell具有很好的列表理解能力,与此类列表的数学表达方式非常匹配。
- Haskell的评价很懒。非常适合使用列表理解技术构造无限列表。
- SML具有真正的交互式解释器,可以在其中定义和使用功能。在Haskell中,必须先在单独的文件中定义函数并进行编译,然后才能在交互式shell中使用这些函数。
- SML以易于理解的语法明确确认了函数参数和返回类型。例如:val foo = fn:int * int-> int。Haskell的隐式咖喱语法有点晦涩,但并非完全陌生。例如:foo :: Int-> Int-> Int。
- Haskell默认情况下使用任意精度整数。它是SML / NJ中的外部库。SML / NJ默认将输出截断为70个字符。
- Haskell的lambda语法很微妙-它使用单个反斜杠。SML更明确。不过,不确定是否在此类中是否需要lambda。
本质上,SML和Haskell大致等效。我倾向于Haskell,因为我喜欢Haskell中的列表理解和无限列表。但是我担心Haskell紧凑语法中的大量符号可能会引起学生问题。从我在SO上的其他文章中收集的信息来看,不建议Haskell开始使用FP。但是,我们不会尝试使用简单的算法来构建功能完善的应用程序。
你怎么看?
编辑:在阅读了您的一些好评后,我应该澄清一些要点。
在SML中,在解释器中定义函数与在外部文件中定义函数之间在语法上没有区别。假设您要编写阶乘函数。在Haskell中,您可以将此定义放入文件中并将其加载到GHCi中:
fac 0 = 1
fac n = n * fac (n-1)
对我来说,这很清楚,简洁,并且与书中的数学定义相符。但是,如果要直接在GHCi中编写函数,则必须使用其他语法:
let fac 0 = 1; fac n = n * fac (n-1)
从教学的角度来看,使用交互式口译员时,学生可以在文件和命令行中使用相同的代码非常方便。
通过“明确确认函数”,我的意思是在定义函数时,SML会立即告诉您函数的名称,参数的类型以及返回类型。在Haskell中,您必须使用:type
命令,然后您会得到一些令人困惑的咖喱符号。
Haskell还有一件很酷的事情-这是一个有效的函数定义:
fac 0 = 1
fac (n+1) = (n+1) * fac n
同样,这符合他们在教科书中可能找到的定义。在SML中无法做到这一点!