2012-10-15 33 views
6

basic.hs:Điều gì sai với định nghĩa kiểu đơn giản này? (Mong thêm một lập luận để ...)

areaCircle :: Floating -> Floating 
areaCircle r = pi * r * r 

Command:

*Main> :l basic.hs 
[1 of 1] Compiling Main    (Sheet1.hs, interpreted) 

Sheet1.hs:2:15: 
    Expecting one more argument to `Floating' 
    In the type signature for `areaCircle': 
     areaCircle :: Floating -> Floating 
Failed, modules loaded: none. 

Tôi thấy rằng areaCircle :: Floating a => a -> a tải như mong đợi. Tại sao phiên bản trên không được chấp nhận?

Trả lời

19

Vì phiên bản của bạn không thực sự cung cấp loại. Floating là một loại lớp. Nếu bạn muốn cho phép bất kỳ Nổi nào thì Floating a => a -> a là chính xác. Nếu không, bạn có thể thử hoặc Float -> Float hoặc Double -> Double.

Chỉ cần ăn thịt thêm một chút: Floating a => a -> a không chỉ nói rằng chức năng của bạn chấp nhận bất kỳ loại Floating nào, nhưng nó trả về cùng loại được truyền. Điều này phải đúng ngay cả khi bạn thu hẹp loại. Ví dụ: bạn sẽ không thể sử dụng Float -> Double mà không thực hiện một số chuyển đổi bổ sung

12

Floating không phải là một loại, đó là loại lớp. Bạn không thể sử dụng một loại lớp như một loại như bạn. Khi bạn nói Floating trong Haskell, bạn đang khẳng định rằng loại sau đây là một thể hiện của lớp. Vì vậy, ví dụ, bạn có thể viết các mã như

areaCircle :: Floating a => a -> a 
areaCircle r = pi * r * r 

mà bạn có thể đọc không chính thức như: cho bất kỳ loại a, nếu a là một thể hiện của lớp Floating sau đó areaCircle có thể được sử dụng như là một chức năng từ a để a.

Bạn có thể nghĩ về Floating giống như tính từ. Nó mô tả các loại. Nhưng bạn đang cố gắng sử dụng nó như một danh từ, tức là. như một loại chính nó.

http://en.wikipedia.org/wiki/Type_class

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