Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 用球拍中的foldl生成n-gram_Scheme_Racket_Fold - Fatal编程技术网

Scheme 用球拍中的foldl生成n-gram

Scheme 用球拍中的foldl生成n-gram,scheme,racket,fold,Scheme,Racket,Fold,所以我在摆弄球拍。从单词列表递归生成n-gram非常简单: (define (n-grams-recursive words n) (if (< (length words) n) '() (cons (take words n) (n-grams-recursive (cdr words) n)))) (define (n-grams words n) (define (iter n-grams remaining-words) (if (<

所以我在摆弄球拍。从单词列表递归生成n-gram非常简单:

(define (n-grams-recursive words n)
  (if (< (length words) n)
      '()
      (cons (take words n) (n-grams-recursive (cdr words) n))))
(define (n-grams words n)
  (define (iter n-grams remaining-words)
    (if (< (length remaining-words) n)
        n-grams
        (iter (cons (take remaining-words n) n-grams)
              (rest remaining-words))))
  (iter '() words))
(定义(n-grams-递归词n)
(如果(<(字长)n)
'()
(cons(取单词n)(n-grams-recursive(cdr单词)n)))
迭代版本也非常简单:

(define (n-grams-recursive words n)
  (if (< (length words) n)
      '()
      (cons (take words n) (n-grams-recursive (cdr words) n))))
(define (n-grams words n)
  (define (iter n-grams remaining-words)
    (if (< (length remaining-words) n)
        n-grams
        (iter (cons (take remaining-words n) n-grams)
              (rest remaining-words))))
  (iter '() words))
(定义(n-n)
(定义(iter n-grams剩余单词)
(如果(<(剩余单词长度)n)
n克
(国际热核实验堆(cons(取剩余单词n)n克)
(其余)
(国际热核实验堆(iter’()字))

但是我如何使用其中一个fold函数进行迭代呢?我知道这一定是可能的,但我已经为此奋斗了一段时间,但毫无结果。我知道折叠的第一个参数应该是一个接受2个参数的函数;在迭代的每个阶段都会显示结果列表和输入列表,并在其中进行获取和考虑,但我一直遇到cons命中非对的问题…

下面是一个使用
for/fold
的解决方案:

(define (n-grams/fold words n)
  (for/fold ([n-grams '()] [remaining-words words])                
            ([_ (in-naturals)] ; loop forever
             #:break (< (length remaining-words) n))
    (values (cons (take remaining-words n) n-grams)
            (rest remaining-words))))
请注意,
foldl
不适合此问题。最好的解决方案是您的原始解决方案

foldl
的问题是一次只能获得列表中的一个元素(并且需要
n
第一个元素)。这意味着您需要同时跟踪n-gram和剩余的单词。为了同时跟踪两件事情,上面的解决方案使用一个结构

Uddate:如果子列表提前生成,则解决方案将变为:

(define (sublists xs)
  (if (empty? xs)
      '()
      (cons xs (sublists (rest xs)))))

(define (n-grams/foldl2 words n)
  (foldl (λ (remaining-words n-grams)
           (if (< (length remaining-words) n)
               n-grams
               (cons (take remaining-words n)
                     n-grams)))
         '()
         (sublists words)))

(n-grams/foldl2 '(a b c d e) 2)
(定义(子列表xs)
(如果(空?xs)
'()
(cons xs(子列表(其余xs()())))
(定义(n-grams/foldl2单词n)
(foldl(λ)(剩余单词n-grams)
(如果(<(剩余单词长度)n)
n克
(反对意见(以剩余的n字为准)
n-克)
'()
(子列表(单词)))
(n-grams/折叠2’(a b c d e)2)