2013-08-16 41 views
14

tôi muốn hợp chất tăng trưởng hơn một năm nhưng tôi không quan tâm đến điểm số thập phân, vì vậy tôi cố gắngChuyển đổi Integer để đôi trong Haskell

take 52 $ iterate (floor . (*1.1)) 100 

Vấn đề là loại (floor . (*1.1))Double -> Integer, trong khi loại được mong đợi bởi arg đầu tiên của iterate là a -> a.

Tôi đã thử một vài cách tiếp cận, nhưng đã kết thúc bản thân mình bằng nút thắt.

Giải pháp ưu tiên để giữ các loại số nhất quán trong ứng dụng chức năng là gì?

+4

Bạn không thể tiếp tục làm tròn kết quả trung gian và hy vọng nhận được câu trả lời đúng ở cuối. Tại sao không di chuyển 'tầng' ra khỏi' bản đồ lặp' và làm 'sàn bản đồ. lấy 52 $ ... '? – Fixnum

+0

@ Fixnum điểm công bằng, nó chỉ là một cái gì đó tôi đã cố gắng để chạy trong ghci khi tôi chạy vào vấn đề này. –

Trả lời

18

Cách thông thường để chuyển đổi Int thành Double là sử dụng fromIntegral, có loại (Integral a, Num b) => a -> b. Điều này có nghĩa là nó chuyển đổi loại Integral (IntInteger) thành bất kỳ loại số b nào, trong đó Double là một phiên bản.

Trường hợp của bạn có vẻ như bạn muốn chuyển đổi một số Double thành Int, mà tôi muốn giới thiệu floor cho, nhưng bạn sẽ phải đảm bảo rằng đầu vào của mình là Double. Đối với điều này, bạn có thể sử dụng chức năng fromIntegral với

take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100 

Tuy nhiên, điều này sẽ cho bạn kết quả không chính xác, vì bạn đang cắt xén ở mỗi bước. Tôi khuyên bạn nên thực hiện

take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100 
+0

Tôi cũng sẽ thêm rằng biểu thức sau sẽ nhanh hơn một chút vì 'fromIntegral' được thực hiện một lần,' (* 1.1) 'vẫn được lặp lại và' tầng' chỉ được thực hiện nhiều lần nếu cần, mặc dù có thể thực hiện đối số để chuyển 'sàn bản đồ' và 'lấy 52'. – bheklilr

+3

Tương đương được viết là: 'lấy 52. bản đồ sàn. lặp lại (* 1.1). fromIntegral $ 100' – Davorak

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