2010-09-04 27 views
31

Tôi đang cố gắng sử dụng loại Có thể trong Haskell. Tôi có một tra cứu cho chìa khóa, giá trị tuples mà trả về một Có thể. Làm cách nào để truy cập dữ liệu được bao bọc bởi Có thể? Ví dụ tôi muốn thêm số nguyên chứa bởi Có thể với một số nguyên khác.Sử dụng Có thể gõ vào Haskell

+1

Đây là một trùng lặp: http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that -contains-just/3375712 # 3375712 –

Trả lời

31

Hoặc bạn có thể mô hình phù hợp:

case maybeValue of 
    Just value -> ... 
    Nothing -> ... 
+1

Điều này giống như những gì tôi đang cố gắng làm hơn là câu trả lời tôi đã tìm thấy. Cảm ơn – dpsthree

+1

Tôi nên nói gì trong tuyên bố loại? – qed

3

Xin lỗi, tôi nên có googled tốt hơn.

sử dụng hàm fromMaybe chính xác là những gì tôi cần. fromMaybe sẽ trả về giá trị trong Có thể nếu nó không phải là không có gì, nếu không nó sẽ trả về một giá trị mặc định được cung cấp cho fromMaybe.

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html

+6

Vâng nhưng hãy chắc chắn rằng đó là hành vi mà bạn muốn, bởi vì nếu bạn đang đi đến, ví dụ, sử dụng một Int có thể và sau đó mỗi khi nó là Không có gì bạn trở về số không thì bạn nên có chỉ cần sử dụng một Int cũ đồng bằng ngay từ đầu. Có lẽ là nghĩa vụ phải giúp mã hóa sự vắng mặt của một kết quả hoặc giá trị và không thực sự nghĩa vụ phải được làm việc xung quanh. Cá nhân tôi cố gắng chỉ đạo rõ ràng về hàm fromMaybe. –

18

Bạn có thể sử dụng Data.Maybe.fromMaybe, trong đó có một và một giá trị Maybe a để sử dụng nếu nó là Nothing. Bạn có thể sử dụng không an toàn Data.Maybe.fromJust, lỗi này sẽ chỉ bị lỗi nếu giá trị là Nothing. Bạn có thể muốn giữ mọi thứ trong Maybe. Nếu bạn muốn thêm một số nguyên trong một Maybe, bạn có thể làm một cái gì đó giống như

f x = (+x) <$> Just 4 

mà là giống như

f x = fmap (+x) (Just 4) 

f 3 sau đó sẽ được Just 7. (Bạn có thể tiếp tục chuỗi tính toán thêm theo cách này.)

+0

'f 3' sẽ là' Chỉ 7', không phải '7'. – Yitz

+0

Đã chỉnh sửa cho phù hợp. – jrockway

8

Cũng giống như một mặt lưu ý: Kể từ Maybe là một Monad, bạn có thể xây dựng tính toán sử dụng do -notation ...

sumOfThree :: Maybe Int 
sumOfThree = do 
    a <- someMaybeNumber 
    b <- someMaybeNumber 
    c <- someMaybeNumber 
    let k = 42 -- Just for fun 
    return (a + b + c + k) 
8

Ví dụ cho "có thể":

> maybe 0 (+ 42) Nothing 
0 
> maybe 0 (+ 42) (Just 12) 
54 
4

Nhiều người đang chống lại việc sử dụng fromJust, tuy nhiên nó có thể được thuận tiện nếu bạn nhận thức được điều gì sẽ xảy ra khi tra cứu thất bại (lỗi !!)

Thứ nhất, bạn sẽ cần này:

import Data.Maybe 

Và sau đó tra cứu của bạn từ một danh sách các hàng sẽ trông như thế này

Data.Maybe.fromJust $ lookup key listOfTuples 

Ví dụ, tra cứu thành công:

Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)] 
1 

Và khủng khiếp thất bại trông như thế này:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)] 
*** Exception: Maybe.fromJust: Nothing 
Các vấn đề liên quan