3

の最小値を取得する方法について質問がありますMap

Map k (Maybe a,Maybe b)タプルの最初の要素(最小)で最小値のキーを取得する必要がありますが、a事前定義された関数が見つかりませんでした。使用できる機能はありますか、それとも自分で実装する必要がありますか?ありがとう

4

1 に答える 1

5

制約が必要になりますOrd a。また、とを比較する方法を決定する必要がありJust xますNothing(と比較する必要があるため(Just x, y)(Nothing, z)。私はあなたがすべてJust xよりも小さくなりたいと思います。マップをリストに変換するために使用する場合は、カスタム比較関数を使用してリストで使用できます。さらに、タプルの2番目の部分()は無関係なので、considerを呼び出して、より一般的な関数を取得します。NothingxtoListminimumByMaybe bMap 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 kNothing最小の要素が見つかった場合に返されることです(上記のように)です(Nothing, _)。これを実現する1つの方法は、最初filterにによって返されるリストtoListを削除して、値が。であるすべての要素を削除することです(Nothing, _)

(*)少しJust x小さくするのNothingはちょっと悪いです。最大の要素を探すときは逆の動作が必要になるため、すべてがかなり一貫性がなく、醜くなります。言い換えると、タイプaが注文されると、タイプは部分的にMaybe aのみ注文されます(当然のことながら、上記のように、完全な注文を強制することもできます)。

于 2012-11-30T12:46:26.470 に答える