Chia Int thành Int và trả về Int


79

Tôi cần một hàm nhận hai Ints ( ab) và trả về A/BInt. Tôi chắc chắn rằng đó A/Bsẽ luôn là một số nguyên.

Đây là giải pháp của tôi:

myDiv :: Int -> Int -> Int
myDiv a b = 
      let x = fromIntegral a
          y = fromIntegral b
      in truncate (x / y)

Nhưng muốn tìm giải pháp đơn giản hơn. Một cái gì đó như thế này:

myDiv :: Int -> Int -> Int
myDiv a b = a / b

Làm cách nào để chia Int thành Int và lấy Int?

Câu trả lời:


140

Tại sao không chỉ sử dụng quot?

quot a b

là thương số nguyên của các số nguyên a và b được cắt ngắn về phía không.


7
Hoặc a `quot` bđối với những người yêu thích infix (wow, bạn thực sự có thể thoát khỏi các dấu gạch chéo ngược trong dấu gạch chéo ngược với dấu gạch chéo ngược?).

38
Ngoài ra a `div` b; nếu tôi nhớ không quotnhầm , hãy cắt bớt (như mong muốn của quỷ) và làm divtròn về 0. Vì vậy (-3) `quot` 4 == 0, và (-3) `div` 4 == -1.
Antal Spector-Zabusky

5
+1 cho div. Tốt hơn về mặt toán học, quotlà một con chó cái khi có những con số âm xung quanh.
luqui

Đây là một cứu cánh cho tôi. Tôi đã vật lộn với fromIntegral (ceiling (int1 / int2))và những thứ khác - không cái nào trong số đó mang lại cho tôi một cơ hội Int, nhưng cái này thì có.
MuffinTheMan

10
divvòng về phía âm vô cùng, không phải bằng không.
Lacuno

1

Đây là những gì tôi đã làm để tạo ra của riêng mình:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b

2
Đẹp như một bài tập, nhưng vô dụng trong sản xuất. Trên số lượng lớn, nó chậm (thời gian tuyến tính) và có dung lượng bộ nhớ cao (không phải đệ quy đuôi). Đối với số âm, nó là sai ( a<0) hoặc không bao giờ kết thúc ( b<0).
Ruud Helderman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.