2016-03-22 7 views
-4

Ona 3 numara vermek ve o hilal onları sipariş gerekir bir programMerhaba im programlama haskell, bana hata veren ghg.hs: 45: 1: ayrıştırma hatası muhtemelen yanlış girinti veya uyumsuz parantez

ordertriple :: (Integer, Integer, Integer) -> (Integer, Integer, Integer) 
ordertriple (x, y, z) 
     | x < y && x < z && y < z = (three x, three y, three z) 
     | x < y && x < z && z < y = (three x, three z, three y) 
     | y < x && y < z && x < z = (three y, three x, three z) 
     | y < x && y < z && z < x = (three y, three z, three x) 
     | z < x && z < y && y < x = (three z, three x, three y) 
     | otherwise    = (three z, three y, three x) 

cevap

3

Eğer teger, Integer, Integer ve x,y,z yılında etrafında (..) eksik: i yapmaya çalıştığım da buydu 3. Thats sayıları çarpar işlevi üç

orderTriple :: (Integer, Integer, Integer) -> (Integer, Integer, Integer) 
orderTriple (x, y, z) 
    | x < y && x < z && y < z = (three x, three y, three z) 
    | x < y && x < z && z < y = (three x, three z, three y) 
    | y < x && y < z && x < z = (three y, three x, three z) 
    | y < x && y < z && z < x = (three y, three z, three x) 
    | z < x && z < y && y < x = (three z, three x, three y) 
    | otherwise    = (three z, three y, three x 

çalışması gerekir

+0

yaptım ve hala yazım hatası bir kez bana ayrıştırma hatası xD @Carsten – Alex96

+0

vererek hala çalışmıyor 'orderTriple' (ben bir şekilde orada var) bu kopyalanır ve ben buradan Haskell'e (ve bazı 'üç' - benim durumumda üç = id ') kullanın - en yakın tahmin: başka bir sorun var demektir. * kodu biz – Carsten

+0

btw görmüyoruz: * work * derler demek ... Herhangi bir zımni mantığı test etmedim – Carsten

2

Her şeyi sipariş etme ve bunları üç ile çarpma tamamen bağımsız işlemlerdir. Onları üç ile çarparak olmadan sipariş vermek için bir işlev yazın.

Bunu en çok üç karşılaştırmada kullanarak nasıl yapabileceğinizi görebiliyor musunuz?

Ayrıştırma hatasına gelince, GHC'yi -fwarn-tabs ile çalıştırın. Sekmeler hakkında sizi uyarırsa, bunun yerine boşluk kullanın.

+0

Bu onun yaklaşımı üzerine bir yorum, soruya bir cevap değil. – chepner

+0

@chepner, bir cevabım vardı, ama sorunun yanlış okunmasına dayanıyordu. Bu yüzden hemen kaldırdım. Şimdi, Carsten'in cevabı hakkındaki yorumlarına dayanarak düzeltme konusunda tavsiyede bulundum. – dfeuer

+0

@chepner, ben de endişeleri ayırarak inanıyoruz * ilk *. Bir ayrıştırma hatası, bir tür hata, çalışma zamanı hatası veya anlamsal bir hatada hata ayıklama olsun, daha küçük parçalarla çalışıyorsanız bunu yapmak daha kolaydır. – dfeuer

2

Kodunuz benim için iyi çalışır ama böyle bir şey dışına daha yeniden kullanımını alırsınız: Zaten

orderedTriple :: (Num a, Ord a) => (a, a, a) -> (a, a, a) 
orderedTriple = mapTriplet (* 3) . orderedTriplet 

mapTriplet :: (a -> b) -> (a, a, a) -> (b, b, b) 
mapTriplet f (x, y, z) = (f x, f y, f z) 

orderedTriplet :: Ord a => (a, a, a) -> (a, a, a) 
orderedTriplet (x, y, z) 
    | x <= u = (x, u, v) 
    | x <= v = (u, x, v) 
    | otherwise = (u, v, x) 
    where (u, v) = orderedPair (y, z) 

orderedPair :: Ord a => (a, a) -> (a, a) 
orderedPair (x, y) 
    | x <= y = (x, y) 
    | otherwise = (y, x)