Как реализовать функцию haskell `\\`? - PullRequest
2 голосов
/ 19 сентября 2011

В haskell, [1,2,3,4,5,6,7] \\ [4,5,6] вернет [1,2,3,7].Теперь я хочу реализовать ту же функцию, используя clisp.До сих пор я нахожу set-difference работ:

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

Есть ли другие решения?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Я не очень хорошо знаю Common Lisp, поэтому вот реализация 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))))))

, где fold и car+cdr взяты из SRFI 1 и receive происходит от SRFI 8 .


Если мы позволим себе использовать форму SRFI 26 * cut,тогда у нас есть решение, которое выглядит еще ближе к версии на Haskell (поскольку последняя использует каррирование как минимум в двух местах):

(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 голосов
/ 19 сентября 2011

Вот соответствующие биты из источника библиотеки haskell.Может быть, вы можете перевести эти определения напрямую.Я не думаю, что он использует что-то конкретное для Haskell.

(источник от http://haskell.org/ghc/docs/latest/html/libraries/base/src/Data-List.html)

delete                  :: (Eq a) => a -> [a] -> [a]
delete                  =  deleteBy (==)

-- | The 'deleteBy' function behaves like 'delete', but takes a
-- user-supplied equality predicate.
deleteBy                :: (a -> a -> Bool) -> a -> [a] -> [a]
deleteBy _  _ []        = []
deleteBy eq x (y:ys)    = if x `eq` y then ys else y : deleteBy eq x ys

(\\)                    :: (Eq a) => [a] -> [a] -> [a]
(\\)                    =  foldl (flip delete)
...