2010-02-20 26 views
5

Tôi có hàm haskell để tính toán kích thước của danh sách Ints hữu hạn. Tôi cần loại đầu ra là một Integer vì giá trị thực sự sẽ được lớn hơn mức tối đa bị ràng buộc của Int (kết quả sẽ là -1 để được chính xác nếu loại đầu ra là một Int)Lỗi Haskell: Không thể khớp với loại được mong đợi `Số nguyên 'với loại được suy ra` Int'

size :: a -> Integer 
size a = (maxBound::Int) - (minBound::Int) 

Tôi hiểu sự khác biệt giữa Ints (bounded) và Integers (unbounded) nhưng tôi muốn tạo một Integer từ Int. Tôi đã tự hỏi nếu có một chức năng như fromInteger, điều đó sẽ cho phép tôi chuyển đổi một Int thành một kiểu Integer.

+0

Bạn không sử dụng 'a'. – kennytm

+0

(trong re. @dons câu hỏi cuối cùng :) Bởi "kích thước của danh sách các Ints hữu hạn" bạn có nghĩa là, các yếu tố số sẽ có trong một danh sách có chứa tất cả các Ints có thể? – MtnViewMark

+0

@KennyTM, Có, tôi biết :) Hàm kích thước là thuộc tính của loại lớp hữu hạn bị quá tải cho các kiểu con riêng biệt (Int, Product of Finites, v.v. vì vậy 'a' được sử dụng để xác định tình trạng quá tải sử dụng – Fry

Trả lời

11

Bạn sẽ cần phải chuyển đổi các giá trị để nguyên, mà có thể được thực hiện bởi các chức năng fromIntegral (đúc số cho Haskell):

fromIntegral :: (Integral a, Num b) => a -> b 

Nó chuyển đổi bất kỳ loại trong lớp Integral cho bất kỳ loại trong (lớn hơn) Num class. Ví dụ.

fromIntegral (maxBound::Int) - fromIntegral (minBound::Int) 

Tuy nhiên, tôi sẽ không thực sự tin tưởng cách tiếp cận bạn đang dùng - có vẻ như rất mong manh. Các hành vi trong sự hiện diện của các loại thừa nhận bao quanh là khá nghi ngờ.

Bạn thực sự muốn nói gì: "kích thước của danh sách Ints hữu hạn". Kích thước trong ý nghĩa này là gì, nếu nó không phải là chiều dài của danh sách?

+0

Vâng, đó là bản chất chiều dài của danh sách, nhưng ngay cả một danh sách hữu hạn có thể lớn. Vì vậy, để có được chiều dài của một danh sách, tôi sẽ cần phải đầu tiên xây dựng danh sách sau đó tương tác với nó. Bằng cách này tôi chỉ có thể tạo ra câu trả lời mà không cần tạo toàn bộ danh sách :) – Fry

4

Tôi tin rằng bạn đang tìm kiếm:

fromIntegral :: (Integral a, Num b) => a -> b 

mà sẽ chuyển đổi một Integer với một Int

+0

... và ngược lại. (tức là chuyển đổi một Int thành một số nguyên) – BMeph

0

Có lẽ bạn đã được giả định rằng Haskell, giống như nhiều ngôn ngữ chính dòng như C và (với một số mức độ) Java, đã ép buộc số ngầm định. Nó không: Int và Integer là các kiểu hoàn toàn không liên quan và có một hàm đặc biệt để chuyển đổi giữa chúng: fromIntegral. Nó thuộc về Num typeclass. Nhìn vào tài liệu: về cơ bản, từIntegral làm nhiều hơn thế: nó là một chung chung "xây dựng biểu diễn của một số nguyên tùy ý", t.i. nếu bạn đang thực hiện một số loại số và khởi tạo Num, bạn phải cung cấp một cách để xây dựng các số nguyên của loại của bạn. Ví dụ, trong thể hiện Num cho các số phức, từIntegral tạo ra một số phức với một phần không tưởng tượng và một phần không thể thiếu.

Ý nghĩa duy nhất trong đó Haskell có áp lực số ẩn là số nguyên nguyên bị quá tải và khi bạn viết 42, trình biên dịch ngầm hiểu nó là "fromIntegral (42 :: Integer)", vì vậy bạn có thể sử dụng số nguyên các ngữ cảnh cần có loại Num.

+0

Xin lỗi là một nitpicker (nhưng vì nó chạm vào một trong những peeves của tôi về lớp "stack", tôi sẽ thưởng thức ...) nhưng từ 'Complex a' type (cái gì , không phải là một lớp học? Đó có phải là một trong những "tối ưu hóa sớm" không?) có ngữ cảnh 'RealFloat a', số phức tạp fromIntegral'd của bạn sẽ không có một phần thực sự tách rời, nhưng là một phần" Thực ", rất có thể là một Đôi. Khác với câu hỏi nhỏ đó, đó là câu trả lời khá hay - tiếp tục! – BMeph

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