我在Haskell中有一个类型为:: [((a, b), (a, b), (a, b))]
的元组元组列表。
对于某些情况,3点(a, b)
表示U形曲线上的(时间,值)对与第一点,在初始时间t1在曲线x1上具有最大值,第三点更长的时间t3 = t1 + dt和值x3
我想通过获取最大[((t1, x1), (t2, x2), (t3, x3))]
的元组,然后返回值t3 - t1
来查找列表x2 - x1
中最宽的U的范围。< / p>
我能想到的唯一方法是首先将列表中的每个元组映射到t3 - t1
,找到它的索引,然后在原始列表中计算该索引的x2 - x1。有更优雅的方式吗?
findMaxTime :: [((a, b), (a, b), (a, b))] -> Int
findMaxTime list = elemIndex (==min) $ map (\(x, y, z) -> fst z - fst x)
where min = minimum $ map (\(x, y, z) -> fst z - fst x)
findMaxVal :: [((a, b), (a, b), (a, b))] -> b
findMaxVal list = list !! findMaxTime list
任何帮助都将不胜感激。
谢谢,Ash
答案 0 :(得分:8)
您可以将maximumBy
与comparing
:
module Main where
import Data.Ord (comparing)
import Data.List (maximumBy)
findMaxVal :: (Num a, Ord a, Num b, Ord b) => [((a, b), (a, b), (a, b))] -> b
findMaxVal = xWidth . maximumBy (comparing tWidth)
where
xWidth ((_, x1), (_, x2), _) = x2 - x1
tWidth ((t1, _), _, (t3, _)) = t3 - t1