Trước hết, tôi đã thay đổi tên của t2s
thành t1s
đầu tiên của bạn, để tôi có thể có cả hai được tải vào ghci cùng một lúc. Nhìn vào các loại suy ra cho mỗi người trong số họ:
[ts.hs:2:1-33] *Main> :t t1s
t1s :: (Enum t, Fractional t) => t -> [t]
[ts.hs:2:1-33] *Main> :t t2s
t2s :: (Enum t, Num t) => t -> [t]
[ts.hs:2:1-33] *Main>
Lưu ý rằng t1s
nhận một đối số Fractional
trong khi t2s
mất một Num
. Điều này có nghĩa là trong t1s 0
, số 0
được phỏng đoán là Double
. Mặt khác, thông dịch viên sẽ nhập 0
vào số Integer
trong t2s 0
. Vì loại được sử dụng cho đối số khác nhau, hành vi có thể khác nhau theo những cách rất đáng ngạc nhiên. Cụ thể, bạn nên đảm bảo chỉ sử dụng các loại Integral
khi liệt kê một danh sách như trong [1,3..n]
.
Để khắc phục điều này, bạn chỉ cần cung cấp chữ ký loại rõ ràng cho cả hai chức năng.
Nguồn
2013-02-22 03:56:39
Để tăng phao, [a, b..c] tiếp tục cho đến khi các số vượt quá c + (b-a) /2.0. Ví dụ [1.0, 2.0 .. 4.0] là [1.0, 3.0, 5.0]. –
Điều gì đã xảy ra với 2.0 và 4.0 trong ví dụ của bạn? –
@ Code-Guru. Mea culpa. Ý tôi là [1.0, 3.0 .. 4.0]. Cảm ơn. –