2015-08-01 15 views
8

Tôi muốn viết hàm Haskell đó là hành vi phụ thuộc vào mẫu regex khớp với một trong các đối số. Trong một ngôn ngữ như C/Python/Perl, tôi chắc chắn sẽ chỉ sử dụng một cấu trúc if/else lớn, nhưng tôi không thực sự có tùy chọn đó. Cách Haskell thành ngữ nhất để xử lý điều này là gì?Sử dụng lệnh regexp trong các bảo vệ chức năng haskell

Tôi đã coi bảo vệ, nhưng họ không làm việc: No instance for (Data.String.IsString source0):

function arg 
    | arg =~ "pattern1" = dothis arg 
    | arg =~ "pattern2" = dothat arg 
    | otherwise = failwith arg 

Các mô hình phù hợp sử dụng trong trường hợp cấu trúc sẽ được hoàn hảo, nếu nó xử lý Regex.

function arg = case arg of 
    (pattern1 match) -> dothis match 
    (pattern2 match) -> dothat match 
    _ -> failwith arg 
+0

trong phiên bản sử dụng gaurds, bạn có thể cần chú thích loại rõ ràng, chẳng hạn như 'function :: String -> ReturnType' –

Trả lời

12

ví dụ đầu tiên của bạn không làm việc cho tôi:

import Text.Regex.Posix 

function :: String -> String 
function arg 
    | arg =~ "pattern1" = "1" 
    | arg =~ "pattern2" = "2" 
    | otherwise = "3" 

Tôi nghĩ lỗi IsString của bạn là do sự mở rộng xâu quá tải. Hãy thử tắt tính năng đó hoặc cố gắng sử dụng các chuỗi String rõ ràng:

function :: String -> String 
function arg 
    | arg =~ ("pattern1"::String) = "1" 
    | arg =~ ("pattern2"::String) = "2" 
    | otherwise = "3" 

Quá ồn ào? Bạn có thể đẩy tàu bay đến các tuyến cuối cùng.

function2 :: String -> String 
function2 arg 
    | arg =~ s"pattern1" = "1" 
    | arg =~ s"pattern2" = "2" 
    | otherwise = "3" 
    where s :: String -> String 
     s = id 

Cần khớp nhóm phụ?

function3 :: String -> String 
function3 arg 
    | [_,x]:_ <- arg =~ s"pat(t*)ern1" = "matched group: " ++ x 
    -- ... 

On function3 "patttern1", biến x sẽ bị ràng buộc để "tt". Trên function3 "xyz", thử nghiệm sẽ thất bại và nhánh tiếp theo sẽ được thử.

+2

' PatternGuards' là tiêu chuẩn, không cần pragma. 'ViewPatterns' có thể thậm chí còn gần hơn với những gì OP yêu cầu hoặc' PatternSynonyms' mới hơn. –

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