2013-04-28 4 views
3

하스켈을 완전히 새롭게 함. 내가 4 개 구성 요소로 구성된 값 생성자를 가진 타입 생성자가 Problem- :목록에서 하스켈의 단일 정수 추출

TrackPoint :: TP { rpm :: Integer 
       , time :: Integer 
       , distance :: Float 
       , speed :: Float 
       } deriving (Show) 

나는 [트랙 포인트] 봤으면과 시간, 거리와 회전 값이 10,000 이하 속도 언제든지 반환 할 것입니다. 나는 행운이없는 경비원을 사용해 보았습니다. 어떤 도움도이 초심자에 의해 평가 될 것입니다.

+1

무엇을 시도 했습니까? 몇 가지 예제 입력을 해당 출력과 함께 제공 할 수 있습니까? – hammar

답변

1

이 함축와 함께 할 쉽습니다 : {-# LANGUAGE RecordWildCards #-}와 더 쉬운

[ (time, distance, speed) 
| TP rpm time distance speed <- trackPoints 
, rpm < 10000 
] 

: 하스켈의 레코드에 대한

[ (time, distance, speed) 
| TP{..} <- trackPoints 
, rpm < 10000 
] 

협약, tpRpm는, 예를 이름 충돌을 피하기 위해 그들 앞에 보통이다.

timesDistancesAndSpeedsOrSomeBetterName <- do 
    TP{..} <- trackPoints 
    guard (rpm < 10000) 
    return (time, distance, speed) 
+0

감사합니다. 한번 시도해 보겠습니다. – user2328270

3

간단한 기능 :

processTrackPoints :: [TrackPoint] -> [(Integer, Float, Float)] 
processTrackPoints tps = 
    map (\tp -> (time tp, distance tp, speed tp)) $ 
    filter (\tp -> rpm tp > 10000) tps 

동일하지만, 포인트 - 무료 수 :

processTrackPoints :: [TrackPoint] -> [(Integer, Float, Float)] 
processTrackPoints = 
    map (\tp -> (time tp, distance tp, speed tp)) . 
    filter ((> 10000) . rpm) 

사용 목록 함축이리스트 모나드 단지 설탕을 기억하는 것이 보람 경비원 :

processTrackPoints :: [TrackPoint] -> [(Integer, Float, Float)] 
processTrackPoints ((TP rpm time distance speed) : t) 
    | rpm > 10000 = (time, distance, speed) : processTrackPoints t 
    | otherwise = processTrackPoints t 
processTrackPoints _ = [] 

물론 이것은 다음과 같이 정확하게 정의 된 데이터 유형을 가지고 있다고 가정합니다.

data TrackPoint = 
    TP { 
    rpm :: Integer, 
    time :: Integer, 
    distance :: Float, 
    speed :: Float 
    } 
    deriving (Show)