2012-01-18 38 views
6

Tôi đang làm việc trên mã sau đây và muốn tìm chỉ mục của số trong chuỗi hộp. Vì vậy, tôi đã sử dụng findIndex nhưng nó trả về giá trị có thể Int trong khi tôi chỉ muốn giá trị Int.Chuyển đổi Có thể Int sang Int trong Haskell

Làm cách nào tôi có thể chuyển đổi giá trị Có thể Int thành Int hoặc có cách nào để tôi có thể trích xuất Int từ Có thể Int. Mã nên in một thông báo lỗi nếu lẽ Int là gì

box:: String 
box = unlines $ ["0 | 1 | 2", 
       "---------", 
       "3 | 4 | 5", 
       "---------", 
       "6 | 7 | 8"] 

moves = do 
     putStrLn " Enter the number" 
     number <- readLn :: IO Int 
     print number 
     findpostion number box 

findposition number box = findIndex (==number) box 

Trả lời

16

Bạn có thể dễ dàng làm điều này bằng mô hình kết hợp trong bản Tuyên Bố do của bạn:

case findposition number box of 
    Just n -> -- do whatever with n 
    Nothing -> putStrLn "Invalid number!" -- you can handle the error however you want. 

Một lựa chọn tốt sẽ tạo một hành động IO riêng để lấy số điện thoại:

getNumber = do putStrLn "Enter the number:" 
       number <- readLn 
       case findposition number box of 
       Just n -> -- Do whatever 
       Nothing -> putStrLn "Please try again." >> getNumber 

Bằng cách này nếu người dùng nhập số không hợp lệ, nó sẽ hỏi lại.

Ngoài ra, như được viết bây giờ, mã của bạn sẽ không hoạt động. Bạn nên có một số cách khác để lưu trữ các số trong số box dưới dạng số thực; ngay bây giờ, họ đang ở trong Strings.

+0

Thực ra ý định là tìm số được người dùng nhập và thay thế sau này bằng bất kỳ ký tự nào khác nói 'x' –

+0

Ah. Trong trường hợp đó, vì bạn đang xem qua một String, bạn sẽ muốn đọc trong một 'Char' thay vì một' Int'. Trong thực tế, bạn sẽ có thể loại bỏ hoàn toàn bit ':: IO Int'. –

+0

Ok cảm ơn .. Tôi sẽ cố gắng này và chắc chắn sẽ lấy lại cho bạn ... –

10

Rõ ràng, không thể nói chung: khi tìm kiếm không thành công, không có giá trị trả về số nguyên chuẩn, do đó bạn nhận được Nothing mà không có bất kỳ giá trị nào như vậy.

Nếu bạn không thực sự quan tâm đến Nothing trường hợp (ví dụ bởi vì bạn sẽ luôn luôn đảm bảo có một yếu tố như vậy), bạn có thể sử dụng chức năng fromJust ra khỏi Data.Maybe, mà bạn cũng có thể nhanh chóng triển khai chính mình:

findposition number = (\(Just i)->i) . findIndex (==number) 

Tuy nhiên điều này không thực sự được đề xuất vì bạn sẽ cần đảm bảo điều này không bị hỏng và thực hiện việc này dễ dàng hơn nhiều bằng cách khớp mẫu phù hợp.

+0

Ông nói rằng ông muốn "trả lại một thông báo lỗi" trên 'Nothing'. Trong khi điều này là một chút mơ hồ, tôi cho rằng anh ta sẽ hạnh phúc chỉ cần in lỗi ra ngoài thay vì có chương trình của mình sụp đổ. –

+4

Nếu có * là * một "số nguyên kinh điển" cho ngữ cảnh mà bạn đang làm việc, bạn có thể sử dụng 'fromMaybe canonicalInt maybeVal' trong đó' canonicalInt :: Int' và 'maybeVal :: Maybe Int'. Xem [Data.Maybe docs] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Maybe.html#v:fromMaybe) –

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