Tôi đang chơi với Haskell mới bắt đầu và tôi muốn viết một hàm trung bình. Nó dường như là điều đơn giản nhất trên thế giới, phải không?
Sai lầm.
Có vẻ như hệ thống kiểu của Haskell cấm trung bình làm việc trên một kiểu số chung - tôi có thể làm cho nó hoạt động trên danh sách Tích phân hoặc danh sách Phân số, nhưng không phải cả hai.
Tôi muốn:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
Nhưng tôi chỉ có thể nhận được:
averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs)
hoặc là
averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs / fromIntegral (length xs)
và cái thứ hai có vẻ hoạt động. Cho đến khi tôi cố gắng chuyển một biến.
*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x
<interactive>:1:0:
No instance for (Fractional Integer)
arising from a use of `averageFrac ' at <interactive>:1:0-8
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: average x
In the definition of `it': it = averageFrac x
Rõ ràng, Haskell thực sự rất kén chọn các loại của nó. Điều đó có lý. Nhưng không phải khi cả hai đều có thể [Num]
Tôi có thiếu một ứng dụng rõ ràng của RealFrac không?
Có cách nào để ép Tích phân vào Phân số không bị nghẹt thở khi nhận được đầu vào Phân số không?
Có cách nào để sử dụng Either
và either
tạo một số loại hàm trung bình đa hình có thể hoạt động trên bất kỳ loại mảng số nào không?
Hệ thống loại của Haskell có cấm hoàn toàn chức năng này tồn tại không?
Học Haskell cũng giống như học Giải tích. Nó thực sự phức tạp và dựa trên hàng núi lý thuyết, và đôi khi vấn đề phức tạp đến mức tôi thậm chí không biết đủ để diễn đạt câu hỏi một cách chính xác, vì vậy bất kỳ cái nhìn sâu sắc nào cũng sẽ được chấp nhận một cách nồng nhiệt.
(Ngoài ra, chú thích cuối trang: điều này dựa trên vấn đề bài tập về nhà. Mọi người đều đồng ý rằng trung bình Frac, ở trên, nhận được đầy đủ điểm, nhưng tôi nghi ngờ rằng có một cách để làm cho nó hoạt động trên cả mảng Tích phân và Phân số)