3

Haskell のまったく新しい。問題 - 4 つのコンポーネントで構成される値コンストラクターを持つ型コンストラクターがあります。

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

[トラックポイント] を使用して、rpm 値が 10,000 未満の場合はいつでも時間、距離、速度を返すようにしたいと考えています。運が悪いのでガードを使ってみました。この初心者は、どんな助けでも大歓迎です。

4

2 に答える 2

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)
于 2013-04-28T17:20:59.793 に答える
1

内包表記で行うのは簡単です:

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

でさらに簡単{-# LANGUAGE RecordWildCards #-}

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

tpRpmリスト内包表記はリストモナドの単なる砂糖であることを覚えておくことも価値があります:

timesDistancesAndSpeedsOrSomeBetterName <- do
  TP{..} <- trackPoints
  guard (rpm < 10000)
  return (time, distance, speed)
于 2013-04-28T17:19:55.750 に答える