2014-12-18 2 views
0

다음 코드를 구현하여 이름 목록에 새 항목을 만들었습니다 (이름과 생년월일 포함). 목록은 알파벳순으로 정렬되며이 정렬을 유지해야합니다. 이름이 같은 경우 날짜가 정렬을 정의합니다. dateTurn 함수는 날짜를 바꿔서 완벽하게 작동합니다.하스켈에서 정렬 된 목록에 새 항목 만들기

type Lastname = String 
type Firstname = String 

dateTurn :: (Int, Int, Int) -> (Int, Int, Int) 
dateTurn (a,b,c) = (c,b,a) 

new :: ((Lastname,Firstname),(Int,Int,Int)) -> [((Lastname,Firstname),(Int,Int,Int))] -> [((Lastname,Firstname),(Int,Int,Int))] 
new x [] = [x] 
new x (y:ys) 
    |(fst x)<(fst y) = x:(y:ys) 
    |(fst x)>(fst y) = y: (new x ys) 
    |(fst x)==(fst y) = if (dateTurn (snd x))<(dateTurn (snd y)) then y: (new x ys) else (x:y:ys) 

스크립트를 컴파일하는 중 오류가 없습니다. 사람 목록을 빈 목록에 추가하면 제대로 작동합니다. 그러나 비어 있지 않은 목록에 추가하면. 프로그램이 작동을 멈추지 않으면 작동을 멈추기 위해 중단해야합니다. 그래서 어떻게이 문제를 해결할 수 있습니까? 당신이 조작

+0

작품에 대한 예를 당신의 유형을. 문제를 일으키는 코드를 표시하십시오. –

+0

BTW, 튜플에 관계 연산자를 사용하고 있다는 사실을 알고 있습니까? 당신이 정말로하고 싶은 것이 아닐 수도 있습니다. –

+0

나는 열심히 실패했다. 내 코드를 복사하여 오펠을 발견했습니다. Dunno 왜 내가 지난 2 일 동안 그것을 찾지 못했을 까 ... ... : D – SiXa

답변

2

은 일반적인 당신해야 추상적 그것을

insertSorted :: Ord a => a -> [a] -> [a] 
insertSorted x [] = [x] 
insertSorted x (y:ys) | x <= y = x: y: ys 
         | otherwise = y: insertSorted x ys 

다음, 나를 위해 Ord

data Person = Person { name :: String 
        , age :: Int 
        } deriving (Eq, Show) 

instance Ord Person where 
    (Person a _) `compare` (Person b _) = a `compare` b 

다음

print $ insertSorted (Person "Peter" 5) [ Person "John" 6 
             , Person "Zorn" 3] 
+0

두 가지 경우에 경비를 사용하는 것이 과잉이 아닌가요? 'if'는 여기에 훨씬 더 적합합니다. –

+4

@ElectricCoffee 스타일 선호도입니다. 일부 경비원은 더 깨끗하고 보편적으로 보입니다. –

관련 문제