建立在什麼亞歷山大·普羅科法爾維回答:
repetitions x = concat (map tail (filter (\x -> (length x) > 1) (List.group (word (filter (\c -> (c >= 'a' && c <= 'z') || (c>='A' && c <= 'Z') || c==' ') x)))))
刪除不必要的括號:
repetitions x = concat (map tail (filter (\x -> length x > 1) (List.group (word (filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x)))))
使用$來去除更多的括號(各$可以替換左括號如果結束括號在表達式的末尾):
repetitions x = concat $ map tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> c >= 'a' && c <= 'z' || c>='A' && c <= 'Z' || c==' ') x
用數據中的函數替換字符範圍。字符,合併CONCAT與地圖:
repetitions x = concatMap tail $ filter (\x -> length x > 1) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
使用部分和自由點式討好簡化(\x -> length x > 1) to ((>1) . length)
。這將length
與(> 1)(部分應用的運算符或部分)合併到從右到左管道中。
repetitions x = concatMap tail $ filter ((>1) . length) $ List.group $ word $ filter (\c -> isAlpha c || isSeparator c) x
消除明確的「X」變量,使整體表達點免費電話:
repetitions = concatMap tail . filter ((>1) . length) . List.group . word . filter (\c -> isAlpha c || isSeparator c)
現在整個功能,從右讀向左,是管道,用於過濾只有阿爾法或分隔符字符,將其拆分爲單詞,將其拆分成組,使用多於1個元素過濾這些組,然後將其餘組減少到每個組的第一個元素。
這個確定的工作,但我發現我沒有被教過地圖和欺騙function.Could這個問題可以回答沒有這兩個功能?我正在爲我的考試練習它不是一項家庭作業。 – SeanHill 2008-12-31 10:12:26
「dupe」只是一個輔助函數,它只是檢查兩個值是否相同。然而,「地圖」可能是Haskell中最重要的功能或任何函數式編程,所以最好只是在考試中瞭解它。 – mattiast 2008-12-31 12:12:06