2011-08-29 9 views
9

Jestem początkujący i próbuję zrobić kilka samouczków na temat Haskella przed wejściem do uni Informatyka.nie może być zgodny z oczekiwanym typem (Int -> Int -> Int) z rzeczywistym typem `(t0, t1, t2) '

Utknąłem w tym programie. Ma trzy liczby i umieszcza je w porządku rosnącym. Czy ktoś może mi pomóc i powiedzieć mi, co jest nie tak, ponieważ doprowadza mnie to do szału? Dziękuję za Twój czas.

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)) 

Błąd jest:

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

Czy rzeczywiście zamierzasz robić Haskell (lub coś w rodzaju FP) na uniwersytecie? Szkoda, że ​​nie dostałem tego w moim programie! – MatrixFrog

Odpowiedz

6

Dajesz kompilatora błędne informacje typu:

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

powinny być

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

Pierwszy wpisując wnosi orderTriple nawróconego s funkcja (z dwóch Int do jednego) na inną taką funkcję, która nie jest wcale tym, co robi twój kod.

(Również: +1 dla nauki FP w przygotowaniu dla programu CS).

+0

thx dużo o twojej pomocy, ale tym razem pojawia się kolejny błąd : 1: 1: Funkcja 'orderTriple 'jest stosowana do trzech argumentów, , ale jej typ' (Int, Int, Int) -> (Int, Int, Int) "ma tylko jeden W wyrażeniu: orderTriple 3 1 9 W równaniu dla" it ": it = orderTriple 3 1 9 – noobie

+0

Definicja' orderTriple' wymaga krotki, czyli przecięcia oddzielone argumenty w nawiasach. Musisz to tak nazwać - 'orderTriples (3,1,9)' - nie za pomocą trzech oddzielonych spacjami argumentów bez nawiasów. –

+0

@noobie: Możesz również sprawdzić, czy używasz okrągłych nawiasów '()' zamiast kwadratowych '[]' w definicji 'orderTriple'. Otrzymany komunikat o błędzie różni się od zamieszczonego powyżej kodu ... – yatima2975

2

Strzałka -> oddziela argumenty funkcji. (W rzeczywistości jest to nieco bardziej skomplikowane) Ale oddzielić argumenty krotki, użyj przecinka:

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

W przypadku innych typów, przestrzeń jest wystarczająca:

Either String Int 
Powiązane problemy