2013-07-04 29 views
15

Hôm nay, tôi thấy mình gõ đoạn mã sau:Sử dụng trường hợp cho một chiều đa nếu

case() of 
    _ | x < 15 -> ... 
    _ | x < 25 -> ... 
    _ | x < 50 -> ... 
    _   -> ... 

Ý nghĩa của điều này là đủ thẳng về phía trước, nhưng nó chỉ cảm thấy ... sai để thốt ra case(). Có ai có một đề nghị tốt hơn?

Tôi cho rằng vì tôi đang xây dựng thương hiệu trên x, tôi có thể đã viết case x. Nhưng điều đó vẫn khiến tôi không có gì để phù hợp với mô hình; đó là tất cả về các vệ sĩ. Và điều đó vẫn cảm thấy kỳ lạ.

+2

gì về [đa chiều nếu] (http://www.haskell.org/gh c/docs/7.6.2/html/users_guide/syntax-extns.html # multi-way-if) trong các phiên bản GHC mới hơn? – Vitus

+6

Có vấn đề gì với chức năng không? 'f x | x <15 = ...; | x <25 = ...; ... ' –

Trả lời

14

Không có gì sai với case(); đó là điều tốt nhất bạn có cho trường hợp sử dụng này trừ khi bạn muốn sử dụng các cú pháp mở rộng và cú pháp không chuẩn gần đây như số multi-way-if của GHC.

14

Những người khác đã nói rằng case nếu tốt và mutli chiều nếu tồn tại, nhưng tôi muốn đi cho một chức năng địa phương thông qua một nơi hoặc để tuyên bố:

someFunction = do 
    x <- monadicOp 
    let f y | y < 5 = expr1 
      | y < 15 = expr2 
      | y < 25 = expr3 
      | True = expr4 
    f x 

Đây là cú pháp sạch hơn so với giải pháp báo cáo trường hợp và di động nhiều hơn so với đa chiều nếu.

EDIT:

Trong trường hợp nó không phải là rõ ràng, nếu giá trị được so sánh, x trong trường hợp này, là đã có trong phạm vi khi bạn xác định các chức năng bảo vệ (f) sau đó bạn chỉ có thể xác định một giá trị thay vì :

someFunction = do 
    x <- monadicOp 
    let r | x < 15 = expr1 
      | x < 25 = expr2 
    r 
+0

Nếu chỉ có một người không phải đặt tên cho 'r', điều này sẽ rất tuyệt. –

+0

Chúng ta có nên tạo phần mở rộng LambdaMultiWayIf không? –

+0

Một cách đa chiều nếu không thực sự có một scrutinee. Vậy bạn muốn làm gì với đối số ẩn danh? –

2

Bạn có thể khai thác đánh giá lười biếng để đưa ra một cái gì đó như thế này:

import Data.List 
import Data.Maybe 
import Control.Applicative 

cases :: [(Bool,a)] -> a -> a 
cases lst d = snd $ fromJust $ (find fst lst) <|> Just (True,d) 

main = do 
    let x = 20 
     r = cases [(x < 15, putStr "15"), 
       (x < 25, putStr "25"), 
       (x < 50, putStr "50")] $ putStr "None" 
    in 
     r 
+0

Bạn cũng có thể sử dụng danh sách hiểu cho điều này, như trong "concat $ [[putStrLn" 15 "| x <15], [putStrLn" 25 "| x <" 25 "], ...] – bennofs

+4

Ngoài ra,' fromJust $ x <|> Chỉ y' là một cách khá phức tạp để viết 'fromMaybe yx' –

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