2011-02-06 37 views
5

Tôi khá mới để Haskell, nhưng nếu bạn thực hiện một câu lệnh if:Haskell IF báo cáo

function a b c 
    | (a+b == 0) = True 
    | --etc. 
    | otherwise = False 

là thứ hai nếu tuyên bố giống như một else if bằng các ngôn ngữ khác, hoặc là nó chỉ khác nếu . Tôi cho rằng cái cũ của nó là bạn chỉ có thể có một đầu ra, nhưng tôi chỉ muốn chắc chắn.

+0

Vâng, dòng lý luận của bạn đã đi đúng hướng. Điều gì có nghĩa là có nhiều hơn một bên phải "thực hiện"? Không có tác dụng phụ nên mọi thứ chúng ta "làm" chúng ta phải quay trở lại. Chúng ta sẽ trả lại giá trị nào? Hoặc chúng ta sẽ phải có một cách để kết hợp chúng ... chúng ta sẽ sử dụng cách nào? (Chỉ cần một vài câu hỏi để hướng dẫn bạn đến triết lý Haskell) – luqui

Trả lời

9

Cấu trúc bạn sử dụng được gọi là bảo vệ . Haskell kiểm tra các lựa chọn thay thế cho nhau cho đến khi một điều kiện sản lượng True. Sau đó nó đánh giá phía bên tay phải của phương trình đó.

Bạn khá tốt có thể viết

function n 
    | n == 1 = ... 
    | n == 2 = ... 
    | n >= 3 = ... 

do đó các loại bảo vệ của đại diện một nếu/elseif xây dựng từ ngôn ngữ khác. Như otherwise chỉ đơn giản là định nghĩa là True, cuối cùng

| otherwise = 

sẽ luôn luôn đúng và do đó đại diện cho một nhận tất cả else khoản.

Không có tháng, Haskell có tuyên bố thông thường a = if foo then 23 else 42.

+0

Làm cho tinh thần, sẽ chấp nhận khi SO cho phép tôi. Cảm ơn! – switz

+2

Lưu ý rằng trong Haskell, phần 'else' của câu lệnh' if' là bắt buộc. Xem [Haskell 2010: Điều kiện] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-320003.6).Và sau đó có ["khi" và "trừ khi"] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:when) –

1

Nó phải giống như một người khác nếu.

Mẫu dưới cùng otherwise thực sự chỉ là True, vì vậy nếu trận đấu đầu tiên không thắng, bạn sẽ luôn nhận được giá trị cụ thể hơn và giá trị khác.

2

Những gì bạn có ở đây không thực sự là một câu lệnh if, mà đúng hơn là một người bảo vệ. Nhưng bạn đúng là trường hợp thứ hai chỉ được "thực hiện" nếu các trường hợp trước đó (theo trường hợp ở đây tôi có nghĩa là các biểu thức giữa |=) không khớp (đánh giá là True). otherwise chỉ là một từ đồng nghĩa với True (theo cách nó luôn "khớp").

1

Đúng. Mặc dù bạn đã sử dụng các vệ sĩ, cách bạn đã thể hiện nó ít nhiều giống với việc sử dụng câu lệnh if. Dòng chảy thử nghiệm có điều kiện để mang lại một kết quả sẽ rơi qua bảo vệ bạn đã viết theo thứ tự mà họ đã được liệt kê trong bảo vệ của bạn.

(a+b == 0) 

sẽ được kiểm tra đầu tiên

etc. 

sẽ được kiểm tra thứ hai và vân vân, với điều kiện không có trước có điều kiện là đúng.

otherwise 

Sẽ được kiểm tra cuối cùng, miễn là không có điều kiện trước là đúng.

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