2016-09-23 47 views

回答

0

這將刪除字符串連接的縮減。

(define (how-many items char) 
    (define r (regexp (format "[^~a]" char))) 
    (string-length (regexp-replace* r (string-join items) ""))) 

; call it with (how-many '("u" "uaub" "ubub") #\u) 

但是,如果您不希望一次卡住所有的字符串,則可以對各個結果進行求和。

(define (how-many items char) 
    (define r (regexp (format "[^~a]" char))) 
    (for/sum ((text (in-list items))) 
    (string-length (regexp-replace* r text "")))) 
+0

''[^〜a]「'匹配什麼? – HelloWorld

+1

在字母#\ u的情況下,「[^〜a \]」首先被格式用於生成字符串「[^ u]」。帶括號的正則表達式部分表示一組字符,而^脫字號表示不在括號的上下文中,因此它最終會變成「任何不是'u'的字符。」這些非U字符被替換爲空字符串。 –

1

什麼是(string-contains? "abc" "b")

什麼是(string-contains? "b" "abc")

+0

Ť 和F,由於 「ABC」 不包含 「b」 的內? – HelloWorld

1

string-contains?語法是:

(string-contains? haystack needle) 

這意味着**你討好的錯誤論點*當你調用

(curry string-contains? a) 

這標識ahaystack:要搜索的字符串,而不是要搜索的字符串。 curry返回一個參數爲1的參數,它接受needle參數,並搜索它是否發生在a中。而你想要的是另一種方式。

幸運的是,球拍對你的解決方案:只需添加信rcurry符號:使用curryr函數來代替,結合最右邊的參數,並從左側的分類:

(curryr string-contains? a) 

這將使aneedle參數一致(在較大的haystack中找到的東西),返回一個採用haystack參數的函數。

此函數然後應用於列表中的每個元素,並計算它返回true的時間。

currycurryr插圖在cons功能:

(map (curry cons 'a) '(1 2 3)) -> ((a . 1) (a . 2) (a . 3)) 
(map (curryr cons 'd) '(1 2 3)) -> ((1 . d) (2 . d) (3 . d)) 

(curry cons 'a)有效地爲我們提供了功能(lambda (arg) (cons 'a arg))

(curryr cons 'd)有效地爲我們提供了功能(lambda (arg) (cons arg 'd))

部分應用程序和柯里可以可視化爲糖,可理解爲嚮明確的和更詳細的lambda語法的轉換。如果您對某些咖啡館的情況感到困惑,時不時會對您有所幫助。

+0

謝謝!我想我現在理解咖喱。 – HelloWorld

0

以下循環也可用於計數發生次數。它採用count功能來查找列表中出現的字符串從獲得:

(define (occur c l) 
    (let loop ((l l) 
      (n 0)) 
    (cond 
     [(empty? l) n] 
     [else (loop (rest l) 
        (+ n 
        (count (lambda(x) (equal? x c)) 
          (string->list (first l)))))]))) 

需要注意的是「U」是要發送的字符。

測試:

(occur #\u '("u" "uaub" "ubub")) 

輸出:

5