Haskellのコードに問題があります。タスクには、日付にIntタイプ、温度度にFloatタイプのデータがあります。気温が月平均に近づいた日付を返す関数を定義する必要があります。これが私のコードです:
data Measuring = Temp Int Float
temp :: Measuring -> Float
temp (Temp _ tem) = tem
date :: Measuring -> Int
date (Temp dat _) = dat
averageTemp :: [Measuring] -> Float
averageTemp lst = (foldr1 (+) (map temp lst)) / fromIntegral (length lst)
closestToAverage :: [Measuring] -> Int
closestToAverage lst = foldl1 (\ t1 t2 -> if abs(averageTemp lst - t1) <=
abs(averageTemp lst - t2)
then date t1 else date t2) lst
エラー
"* Couldn't match expected type `Int' with actual type `Float'
* In the expression:
foldl1
(\ t1 t2
-> if abs (averageTemp lst - t1) <= abs (averageTemp lst - t2) then
date t1
else
date t2)
lst
In an equation for `closestToAverage':
closestToAverage lst
= foldl1
(\ t1 t2
-> if abs (averageTemp lst - t1) <= abs (averageTemp lst - t2) then
date t1
else
date t2)
lst
|
83 | closestToAverage lst = foldl1 (\ t1 t2 -> if abs(averageTemp lst - t1) <= abs(averageTemp lst - t2)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
のタイプはfoldl1
ですFoldable t => (a -> a -> a) -> t a -> a
。高階関数は、2つの入力タイプと同じ出力タイプでなければならないことに注意してください。したがって、t1
ort2
ではなくdate t1
orを返す必要がありますdate t2
。
また、t1
とt2
はタイプがあるため、からMeasuring
減算することはできませんaverageTemp lst
。でFloat
値を抽出する必要がありますtemp
。
closestToAverage :: [Measuring] -> Int
closestToAverage lst = date $ foldl1 (\t1 t2 ->
if abs (averageTemp lst - temp t1) <= abs (averageTemp lst - temp t2)
then t1
else t2
) lst
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加