2010-09-05 59 views
8
getMultiWordPortion :: String -> String 
getMultiWordPortion (x:':':xs) = xs 
getMultiWordPortion _ = "" 

此代碼中模式匹配的預期結果是,第一個冒號get之前的所有內容都被分配給x,之後的所有內容都被分配給xs,這就是結果。如果沒有冒號,則不返回任何內容。字符串上的Haskell模式匹配 - 爲什麼這不起作用?

與我使用的樣本串居然會發生什麼(「PING:gibson.freenode.net」 - 這是一個IRC客戶端的一部分)是我得到的空白返回值。

我在這裏做錯了什麼?

+0

也許,這將有助於:http://stackoverflow.com/questions/1602243/pattern-matching-string-prefixes-in-haskell – 2010-09-05 13:03:23

+1

FWIW,邏輯語言(如Prolog,Curry)是可以做的這種模式匹配。當模式的全部功能可用時,這非常酷(不要視爲對Haskell的批評) – luqui 2010-09-05 13:35:10

回答

16

模式x:':':xs表示「第一個字符是x,第二個字符是':'其餘字符在列表xs」。所以這意味着x的類型是Char,而不是[Char],並且該模式只有在冒號前有一個字符時才匹配。

沒有辦法使用模式匹配列表上的說「匹配一個子表,然後一個元素,然後剩下的名單」。

要獲得第一個冒號後面的子字符串,您可以使用dropWhile (/= ':') theString。這將包括冒號,所以使用tail或模式匹配將其刪除。

+1

或者,如果使用View Patterns,則可以成爲真正的花式褲: – BMeph 2012-03-20 16:53:55

4

:操作者conses之外一個元件到一個列表的頭部。您的模式只會匹配冒號是列表中第二項的字符串。