2011-12-18 36 views
5

Tôi đang cố gắng tạo một hàm đơn giản để trả về chuỗi văn bản trung tâm trong Haskell, nhưng tôi đang gặp sự cố khi chỉ tìm mức độ đệm để chèn hai bên. Tôi có điều này:Chuyển đổi giữa các loại trong Haskell

center padLength string = round ((padLength - (length string))/2) 

Mà cho các lỗi sau:

No instance for (Fractional Int) 
    arising from a use of '/' 
Possible fix: add an instance declaration for (Fractional Int) 
In the first argument of 'round', namely 
    '((padLength - (length string))/2)' 
In the expression: round ((padLength - (length string))/2) 
In an equation for `center': 
    center padLength string = round ((padLength - (length string))/2) 

Làm thế nào tôi có thể (về cơ bản) chuyển đổi từ một đôi (tôi nghĩ) đến một Int?

Trả lời

9

Vấn đề không phải là bạn không thể chuyển đổi Double thành Int - round hoàn thành điều đó tốt - đó là bạn đang cố phân chia trên Int (padLength - length string). Thông báo lỗi chỉ cho bạn biết rằng Int không phải là một thể hiện của Fractional, typeclass cho các số có thể được chia.

Nói chung, bạn có thể sử dụng fromIntegral (padLength - length string) để biến nó thành một đôi, nhưng trong trường hợp này, bạn chỉ có thể sử dụng phân chia số nguyên trực tiếp:

center padLength string = padLength - (length string) `div` 2 

a `div` b chỉ là một cách đẹp hơn viết div a b; bạn có thể sử dụng bất kỳ hàm nào làm toán tử nhị phân như thế này.

+0

Tại sao nó cần '? Tôi hơi mới với Haskell –

+1

Tôi đã thêm thông tin đó vào câu trả lời của mình :) – ehird

1

Bạn đang cố gắng sử dụng phân chia phân đoạn / trên các toán hạng của loại tích phân, nhưng điều đó không được xác định.

Bạn nên chuyển đổi toán hạng thành Đôi trước khi chia (sử dụng fromIntegral) hoặc sử dụng phân chia không tách rời div.

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