2011-12-19 26 views
6

Làm thế nào để tôi nói Haskell để giải thích một cái gì đó như là một loại đặc biệt? Ví dụ, tôi có một danh sách và muốn chia chiều dài của nó bằng 2. Vì vậy, tôi viếtHaskell: "Truyền"/loại lực?

(length mylist)/2 

và nhận được lỗi này

Không dụ cho (Fractional Int) phát sinh từ việc sử dụng của `/'

Như tôi muốn có một bộ phận toàn bộ số, tôi muốn làm cho length mylist, 2 và kết quả Int.

+0

JFI có hàm 'genericLength' trong' Data.List'. Trong trường hợp của bạn, nó sẽ không trả về câu trả lời toàn bộ số, nhưng nó thường hữu ích vì nó cho phép bạn tránh một số cuộc gọi 'fromIntegral' khó xử. –

+0

Cần thêm 'fromIntegral'. Nghiêm túc, mặc dù, 'fromIntegral' là cách kỳ diệu để" đúc "một Int cho bất cứ điều gì mà instantiates' Num' typeclass. –

Trả lời

11

Có hai vấn đề khác nhau ở đây.

  • phận Integer: Sử dụng chức năng div: div (length mylist) 2 hoặc (length mylist) `div` 2

  • Đúc. Người ta có thể nói với Haskell rằng một biểu thức cụ thể có một loại cụ thể bằng cách viết expression :: type thay vì chỉ expression. Tuy nhiên, điều này không thực hiện bất kỳ giá trị "truyền" hoặc "chuyển đổi" nào. Một số chức năng hữu ích để chuyển đổi giữa các loại số và chuỗi khác nhau là fromIntegral, show, read, realToFrac, fromRational, toRational, toInteger và các loại khác. Bạn có thể tra cứu chúng trên Hoogle.

5

Hãy thử div (length my list) 2. / phân chia phân đoạn; div thực hiện phân chia số nguyên.

+0

Ah, cảm ơn. Và làm thế nào để làm điều đó nói chung? Bạn có luôn phải tuân theo định nghĩa loại chức năng không? – user905686

+0

Có các hàm cho phép bạn chuyển đổi từ kiểu này sang kiểu khác (chẳng hạn như số nguyên thành phân số), nhưng có, bản chất của Haskell là như vậy nếu các kiểu không phù hợp với định nghĩa của hàm, bạn * sẽ * gặp lỗi. – mipadi