沒有給太多的東西,因爲這是作業,這裏有一些提示。
你知道列表解析嗎?在這種情況下它們會很有用。例如,你可以用if
表達結合他們做這樣的事情:
*Main> let starS s = [if c == 's' then '*' else ' ' | c <- s]
*Main> starS "schooners"
"* *"
你甚至可以利用它們來做過濾。例如:
*Main> let findFives xs = [x | x <- xs, x == 5]
*Main> findFives [3,7,5,6,3,4,5,7,5,5]
[5,5,5,5]
這些都不是一個完整的答案,但不應該很難看出如何使這些結構適應您的情況。
你還應該考慮一下你是否真的需要一個警衛!例如,下面是一個與您的風格一樣寫的功能:
lensMatch [] [] = True
lensMatch xs ys
| ((length xs) == (length ys)) = True
| otherwise = False
這是一個功能,可以做同樣的事情!
lensMatch' xs ys = length xs == length ys
你可以看到它們是相同的;測試第一:
*Main> lensMatch [1..4] [1..4]
True
*Main> lensMatch [1..4] [1..5]
False
*Main> lensMatch [] [1..5]
False
*Main> lensMatch [] []
True
和測試第二:
*Main> lensMatch' [1..4] [1..4]
True
*Main> lensMatch' [1..4] [1..5]
False
*Main> lensMatch' [] [1..5]
False
*Main> lensMatch' [] []
True
最後,我上面sblom的評論非常強烈同意; zeros [] []
應該是True
!考慮以下語句:「對於集合s中的每個項目x,x> 0」。如果set s是空的,那麼聲明是真的!這是真的,因爲根本沒有任何物品。這在我看來就像是一個類似的情況。
似乎我認爲'零[] []'應該等於'真'嗎?至少它看起來不像'zeros [1] []',你的代碼會認爲'真'。我不知道你甚至不需要處理'零[] []'... – sblom 2012-04-23 23:49:57
不,我不認爲它應該是因爲如果列表是空的,那麼它們將不包含零,因此它將是假 – 2012-04-23 23:51:34
我很難說服自己「無零」和「零零」不是同一件事。例如,'zeros [1] []'會按照你寫的東西(都是零)返回True。而'零'[] []'會返回'假'(儘管兩者都有零)。 – sblom 2012-04-23 23:54:27