如何实现haskell ' '函数



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

(set-difference '(1 2 3 4 5 6 7) '(4 5 6))

以下是haskell库源代码的相关部分。也许你可以直接翻译这些定义。我不认为它使用了Haskell特有的任何东西。

(来源:http://haskell.org/ghc/docs/latest/html/libraries/base/src/Data-List.html)

<>之前delete:: (Eq a) => a -> [a] -> [a]delete = deleteBy (==)——| 'deleteBy'函数的行为类似于'delete',但需要一个参数——用户提供的相等谓词。deleteBy::(a -> a -> Bool) -> a -> [a] -> [a]deleteBy _ [] = []deleteBy eq x (y:ys) =如果x ' eq ' y,则y = ys,否则y: deleteBy eq x ys(\) :: ( Eq) => [a] -> [a] ->[一](\) = foldl(翻转删除)

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

(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 1, receive来自SRFI 8。


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

(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))))))

最新更新