の最小値を取得する方法について質問がありますMap
。
Map k (Maybe a,Maybe b)
タプルの最初の要素(最小)で最小値のキーを取得する必要がありますが、a
事前定義された関数が見つかりませんでした。使用できる機能はありますか、それとも自分で実装する必要がありますか?ありがとう
制約が必要になりますOrd a
。また、とを比較する方法を決定する必要がありJust x
ますNothing
(と比較する必要があるため(Just x, y)
)(Nothing, z)
。私はあなたがすべてJust x
よりも小さくなりたいと思います。マップをリストに変換するために使用する場合は、カスタム比較関数を使用してリストで使用できます。さらに、タプルの2番目の部分()は無関係なので、considerを呼び出して、より一般的な関数を取得します。Nothing
x
toList
minimumBy
Maybe b
Map k (Maybe a, b)
私は次のようなものを提案します
import qualified Data.Map as M
import Data.List
minimum' :: (Ord a) => M.Map k (Maybe a, b) -> k
minimum' = fst . (minimumBy comp) . M.toList
where
comp (_, (Nothing, _)) (_, (Just _, _)) = GT
comp (_, (Just _, _)) (_, (Nothing, _)) = LT
comp (_, (Nothing, _)) (_, (Nothing, _)) = EQ
comp (_, (Just x, _)) (_, (Just y, _)) = compare x y
sに関して実際にどのような動作が必要かを判断するのは難しいですNothing
が、別のより合理的な(*)代替手段は、最小関数がreturn型を持ちMaybe k
、Nothing
最小の要素が見つかった場合に返されることです(上記のように)です(Nothing, _)
。これを実現する1つの方法は、最初filter
にによって返されるリストtoList
を削除して、値が。であるすべての要素を削除することです(Nothing, _)
。
(*)少しJust x
小さくするのNothing
はちょっと悪いです。最大の要素を探すときは逆の動作が必要になるため、すべてがかなり一貫性がなく、醜くなります。言い換えると、タイプa
が注文されると、タイプは部分的にMaybe a
のみ注文されます(当然のことながら、上記のように、完全な注文を強制することもできます)。