我是一个新手哈斯克尔,但有一个以前的Lisp /计划的经验。现在,我期待在从SICP的例子并努力实现它们在Haskell获得更多的实践经验。在讲座3b中作者提出了一种功能,用于象征性地计算衍生物。它包含,除其他外,下面的行:

(define (deriv exp var)
    (cond ((constant? exp var) 0)
          ((same-var? exp var) 1)
; ...

此外,在演讲中,一些更多的功能被定义:

(define (constant? exp var)
    (and (atom? exp)
         (not (eq? exp var))))

有没有办法做同样的事情在Haskell,即检查原子性和象征性的等价一些其他功能?或多个通用,什么是“拆卸”功能在Haskell?的手段

有帮助吗?

解决方案

您计划的例子实际上不检查方案的功能。我最近做在Haskell一些符号微分超过下述类型的值:

data Exp a = Lit a
           | Exp a :*: Exp a
           | Exp a :+: Exp a
           | Var String
  deriving Eq

除了使用atom?eq?使用case(或其它模式匹配)和==。判别的

其他提示

首先,虽然SICP是很大的,我建议反对对学习Haskell。(#)一些在这一问题的难度的源于此。

在Lisp中/方案,一个 '功能' 被认为一段代码的,和检查的功能仅仅意味着检查其代码。在Haskell中,一个“功能” 装置到它的数学定义更接近的东西,作为一个从集合A到集合B映射因此,例如,它是有意义的,在Lisp的背景下,要比较两个功能:只是比较他们的代码。 (但(x+y)^2x^2+2*x*y+y^2不同的功能?)在Haskell,这取决于是否存在用于确定类的你正在考虑的功能平等建设性的过程。

同样,在你的问题,用Lisp /计划,你会写一个“导出”功能给出的表情,只是错误的时候了或任意输入返回垃圾能正确区分。在Haskell的类型系统,这是(据我所知)是不可能的事,因为,如果你想想看,有作为区分任意输入没有这样的事情:你只能区分表达式(或者可能是一个更一般的类,但仍然没有一切)。所以在诺曼拉姆齐的答案,首先要定义一个“表达式”类型(或类型的类),这是很简单的事,然后写函数

derive :: Expression -> Expression

这(取决于Expressions是如何建立别的东西或)反汇编使用模式匹配构建一个Expression


(#):其原因是,具有SICP一个完全不同的理念,这涉及使用无类型的编程语言和鼓励缺乏代码和数据之间的区别。虽然有一些优点的“代码=数据”的说法(例如以下事实,即我们使用的冯·诺依曼架构,“一切都是0和1反正”),它不一定推理约或建模问题的好办法。 (见菲利普·沃德勒的为什么计算比心机<水平/一>更多关于这一点。)如果你想用一个功能性的味道,而不是真实世界一个,也许是西蒙·汤普森的的Haskell:函数式编程的工艺或理查德·伯德的介绍如何使用Haskell的函数式编程是更好的选择。

我不认为你可以做到这一点。 Lisp是 homoiconic ,Haskell是不

然而,进一步的谷歌搜索翻起 Liskell 时,它是(?)一个有趣的混合体。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top