Tôi đã bắt đầu thử nghiệm với Haskell và gặp sự cố. qqq là một hàm sẽ in một chuỗi nếu được gọi là "Không có gì" và in những thứ khác nếu được gọi với "Chỉ một cái gì đó".Sử dụng "Có thể" của Haskell, nhập khai báo [câu hỏi của người mới bắt đầu]
Các nỗ lực đầu tiên có vẻ như làm việc:
qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x
main :: IO()
main = qqq (Just 43)
Nhưng:
- khi tôi cố gắng để làm cho
main = qqq (Nothing)
nó không thành công ("loại mơ hồ biến 'a0' trong chế: (Hiển thị a0) phát sinh từ việc sử dụng 'qqq' ") - Khi tôi muốn thêm chữ ký loại nếu không thành công:
-
qqq :: Maybe x => x -> IO()
->Type constructor 'Maybe' used as a class
-> Nhưng phải không?
-
qqq :: (Maybe x) -> IO()
. Bây giờ chữ ký chính nó trông giống như thành công. Nhưngmain = qqq (Just 43)
bắt đầu không thành công với lỗi(Show a0)
bí ẩn như trong trường hợpmain = qqq (Nothing)
.
Câu hỏi:
- Tại sao gọi QQQ với
Nothing
là quá khác biệt so với gọi vớiJust 43
? (Show a0)
là gì? Nó chỉ được đề cập trong các thông báo lỗi. Mọi nỗ lực để sử dụng nó dẫn đến một cái gì đó như "Hiển thị không trong phạm vi".- Chữ ký loại chính xác cho điều này là gì? Làm thế nào để làm cho chữ ký loại in Haskell nó suy luận? Mong đợi một cái gì đó như:
f 0 = 2
f x = (f (x-1)) + 3
main = print get_type_as_string(f)
-- prints "Number -> Number"
Cũng trả lời câu hỏi không được hỏi "Tại sao tôi không thể đặt bất cứ điều gì trong ghci, nó than phiền' phân tích lỗi trên '=' '" –
Là "loại mơ hồ" luôn luôn thất bại trong Haskell hoặc nó có thể quyết định "loại không quan trọng ở đây, vì vậy hãy để nó mơ hồ "đôi khi? –
Haskell phàn nàn về các loại không rõ ràng khi trình biên dịch không biết phải làm gì. Vì vậy, nếu trình biên dịch có thể tìm ra loại nào sẽ không có vấn đề gì, nhưng nếu loại phải được suy ra mà không có đủ thông tin về nó thì bạn sẽ gặp lỗi. – Antti