2011-08-29 37 views
9

Tôi là người mới bắt đầu và tôi đang cố gắng thực hiện một số hướng dẫn trên Haskell trước khi nhập uni cho khoa học máy tính.không thể khớp với loại mong muốn (Int -> Int -> Int) với loại thực tế `(t0, t1, t2) '

Tôi bị kẹt trong chương trình này. Phải mất ba số và đặt chúng theo thứ tự tăng dần. Bất cứ ai có thể giúp tôi và cho tôi biết whats sai vì nó lái xe cho tôi điên? Cảm ơn vì đã dành thời gian cho tôi.

import Prelude hiding (min,max) 
orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 
max :: Int -> Int -> Int -> Int 
min :: Int -> Int -> Int -> Int 
middle :: Int -> Int -> Int -> Int 


max x y z 
|(x>=y) && (x>=z) = x 
|(y>=x) && (y>=z) = y 
|otherwise  = z 

min d e f 
|(d<=e) && (d<=f) = d 
|(e<=d) && (e<=f) = e 
|otherwise  = f 

middle g h i 
| (g <= (max g h i)) && (g >= (min g h i)) = g 
| (h <= (max g h i)) && (h >= (min g h i)) = h 
| otherwise     = i 

orderTriple (a,b,c) = ((min a b c),(middle a b c),(max a b c)) 

Lỗi này là:

orderList.hs:23:13: 
    Couldn't match expected type `[Int -> Int -> Int]' 
       with actual type `(t0, t1, t2)' 
    In the pattern: (a, b, c) 
In an equation for `orderTriple': 
    orderTriple (a, b, c) = [(min a b c), (middle a b c), (max a b c)] 
+0

Bạn có thực sự sẽ được làm Haskell (hoặc một số loại FP) trong trường đại học? Tôi ước tôi đã nhận được điều đó trong chương trình của mình! – MatrixFrog

Trả lời

6

Bạn cho trình biên dịch thông tin sai loại:

orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 

nên

orderTriple :: (Int, Int, Int) -> (Int, Int, Int) 

Các gõ đầu tiên tuyên bố rằng orderTriple convert s một chức năng (từ hai Ints đến một) vào một chức năng như vậy, mà không phải là tất cả những gì mã của bạn làm.

(Ngoài ra: +1 để nghiên cứu FP để chuẩn bị cho chương trình CS).

+0

thx rất nhiều về sự giúp đỡ của bạn nhưng lần này nó xuất hiện một lỗi khác : 1: 1: Hàm 'orderTriple 'được áp dụng cho ba đối số, nhưng loại của nó' (Int, Int, Int) -> (Int, Int, Int) 'chỉ có một Trong biểu thức: orderTriple 3 1 9 Trong một phương trình cho' it ': it = orderTriple 3 1 9 – noobie

+0

Định nghĩa của 'orderTriple' mong đợi một tuple, có nghĩa là, dấu phẩy- đối số được tách trong dấu ngoặc đơn. Bạn phải gọi nó theo cách đó - 'orderTriples (3,1,9)' - không phải với ba đối số được phân cách bằng dấu cách (curried) mà không có dấu ngoặc đơn. –

+0

@noobie: Bạn cũng có thể muốn kiểm tra xem bạn đang sử dụng dấu ngoặc tròn '()' thay vì dấu ngoặc vuông '[]' trong định nghĩa 'orderTriple'. Thông báo lỗi mà bạn cung cấp khác với mã liệt kê ở trên ... – yatima2975

2

Mũi tên -> tách đối số của hàm. (Trên thực tế nó là phức tạp hơn một chút) Nhưng để tách các đối số của một tuple, sử dụng dấu phẩy:

orderTriple :: (Int,Int,Int) -> (Int,Int,Int) 

Trong trường hợp của các loại khác, một không gian là đủ:

Either String Int 
Các vấn đề liên quan