2015-05-06 17 views
5

Giờ trước ở trường chúng tôi bắt đầu học Haskell. Chúng tôi sử dụng Helium compiler vì nó nhanh chóng và dễ sử dụng.Lỗi phân chia trong Haskell

Tôi bắt đầu nhập các chức năng tiêu chuẩn như *, + ... Nhưng quá trình phân chia không hoạt động. Tôi cố gắng 5/2 hoặc 4/2 và nhận được tin nhắn này:

"Type error in infix application 
expression  : 3/5 
operator   :/
    type   : Float -> Float -> Float 
    does not match : Int -> Int -> a " 

Làm thế nào tôi có thể sử dụng toán tử devision để có được 2.5 từ 5/2?

tôi đã cố gắng div 5 2 nhưng sau đó tôi nhận được 2 và không 2.5

+0

FYI, hàm 'div' có nghĩa là phân chia số nguyên, không phải là phân chia dấu phẩy động, là hai thứ riêng biệt và hoàn toàn hữu ích. – bheklilr

Trả lời

2

Các thông báo lỗi nói rằng / hy vọng dấu chấm ("thật") con số, và bạn cung cấp số nguyên.

Bạn có thể đặt đối số một cách rõ ràng dấu phẩy động: 5.0/2.0.

Bạn có thể chuyển đổi các giá trị để dấu chấm động (chỉ hoạt động trong GHC, không cố gắng Helium):

let a = 1::Int 
let b = 2::Int 
-- here a/b gives a type error like you reported 
show $ fromIntegral a/fromIntegral b -- works 
9

Theo documentation

  • literals số được không bị quá tải (ngay cả khi sử dụng cờ --overloading). Do đó, 3 là loại Int3.0 loại Float. Kết quả là bạn không bao giờ có thể viết 2 + 2.3, mặc dù ở chế độ quá tải, bạn có thể viết cả hai 2 + 32.0 + 3.0.

Ngoài ra:

  • Có năm built-in loại lớp học với các trường hợp sau đây:
    • Num: Int, Float

Vì vậy, để có được phân chia dấu chấm động, bạn sẽ phải sử dụng các dấu phẩy dấu phẩy động rõ ràng, chẳng hạn như 5.0/2.0.


Điều đáng chú ý là trong Haskell bản thân (Helium chỉ là một tập hợp con của Haskell) biểu thức 5/2 cũng được đánh máy và sẽ có các loại Fractional a => a, nhưng Helium không xuất hiện để có Fractional typeclass ở tất cả, chỉ có IntFloat làm loại số, vì vậy Haskell thực sự hợp lệ sẽ hoạt động như bạn mong đợi sẽ không hoạt động trong Helium.

Nếu bạn đang sử dụng Helium có vẻ như bạn sẽ có thể cài đặt nó bằng cách sử cabal theo hướng dẫn của trang web:

> cabal install helium lvmrun 

thì bạn nên có quyền truy cập vào GHC và GHCi. Hãy thử chạy GHCi làm trình bao tương tác của bạn để xem có giúp ích gì không. Bạn có thể gặp phải các lỗi khó đọc lúc đầu hơn Helium, nhưng lỗi kiểu Haskell rất thông tin trong phần lớn các trường hợp.

+0

Cảm ơn bạn đã giải thích. Tôi hiểu nó và nó hoạt động ngay bây giờ. –