首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现haskell `\\`函数?

如何实现haskell `\\`函数?
EN

Stack Overflow用户
提问于 2011-09-19 14:49:33
回答 1查看 279关注 0票数 2

在haskell中,[1,2,3,4,5,6,7] \\ [4,5,6]将返回[1,2,3,7]。现在我想使用clisp实现相同的函数。到目前为止,我发现set-difference工作正常:

代码语言:javascript
复制
(set-difference '(1 2 3 4 5 6 7) '(4 5 6))

有没有其他的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2011-09-19 15:12:21

我不太了解Common Lisp,所以下面是Ben粘贴的代码的Scheme实现:

代码语言:javascript
复制
(define (difference big small)
  (fold delete big small))

(define (delete x lst)
  (delete-by equal? x lst))

(define (delete-by equal? x lst)
  (if (null? lst) '()
      (receive (y ys) (car+cdr lst)
        (if (equal? x y) ys
            (cons y (delete-by equal? x ys))))))

其中foldcar+cdr来自SRFI 1receive来自SRFI 8

如果我们允许自己使用SRFI 26cut表单,那么我们就有了一个看起来更接近Haskell版本的解决方案(因为后者至少在两个地方使用了currying ):

代码语言:javascript
复制
(define difference (cut fold delete <...>))
(define delete (cut delete-by equal? <...>))

; Unchanged from the above version
(define (delete-by equal? x lst)
  (if (null? lst) '()
      (receive (y ys) (car+cdr lst)
        (if (equal? x y) ys
            (cons y (delete-by equal? x ys))))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7467367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档