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

Kết quả mong đợi từ kết hợp mẫu trong mã này là mọi thứ trước dấu đầu tiên được gán cho x và mọi thứ sau đó được gán cho xs, là kết quả. Nếu không có dấu hai chấm, không có gì được trả lại.Ghép mẫu Haskell trên dây - Tại sao tính năng này không hoạt động?

Điều gì thực sự xảy ra với chuỗi mẫu tôi đang sử dụng ("PING: gibson.freenode.net" - đó là một phần của ứng dụng khách IRC) là tôi nhận được giá trị trả lại trống.

Tôi đang làm gì sai ở đây?

+0

Có lẽ, điều này sẽ giúp: http://stackoverflow.com/questions/1602243/pattern-matching-string-prefixes-in-haskell –

+1

FWIW, Các ngôn ngữ logic (ví dụ: Prolog, Curry) là những ngôn ngữ có thể làm kiểu kết hợp này. Thật tuyệt khi có đầy đủ các mẫu có sẵn (không được coi là một lời chỉ trích của Haskell) – luqui

Trả lời

16

Mẫu x:':':xs có nghĩa là "Ký tự đầu tiên là x, ký tự thứ hai là ':' các ký tự còn lại nằm trong danh sách xs". Vì vậy, điều này có nghĩa là loại xChar, không phải [Char] và mẫu đó chỉ phù hợp nếu có chính xác một ký tự trước dấu hai chấm.

Không có cách nào để sử dụng đối sánh mẫu trên danh sách để nói "khớp với một danh sách con, theo sau là một phần tử, tiếp theo là danh sách còn lại".

Để nhận chuỗi con sau dấu hai chấm đầu tiên, bạn có thể sử dụng dropWhile (/= ':') theString. Điều này sẽ bao gồm dấu hai chấm, do đó hãy sử dụng tail hoặc đối sánh mẫu để xóa dấu hai chấm.

+1

Hoặc, nếu bạn sử dụng Dạng xem, bạn có thể là một chiếc quần ưa thích thực sự: – BMeph

4

Nhà điều hành : đáp ứng phần tử một phần vào đầu danh sách. Mẫu của bạn sẽ chỉ khớp với một chuỗi trong đó dấu hai chấm là mục thứ hai trong danh sách.

Các vấn đề liên quan