gpt4 book ai didi

sorting - 根据异构标准进行 map 比较

转载 作者:行者123 更新时间:2023-12-02 10:26:28 24 4
gpt4 key购买 nike

mconcat (map comparing [length, last, id]) "abc" "def"

这当然不会进行类型检查。该列表包含从相同域到不同共域的函数。但我希望意图是明确的。某些类型注释或其他解决方法(不将比较放在 3 个位置或类似的地方)可以使其工作吗?

最佳答案

只要您不介意不将函数放在列表中,一切都会很顺利:

GHCi> :t comparing length <> comparing last <> comparing id
comparing length <> comparing last <> comparing id
:: Ord a => [a] -> [a] -> Ordering
GHCi> (comparing length <> comparing last <> comparing id) "abcd" "abc"
GT
GHCi> (comparing length <> comparing last <> comparing id) "abd" "abc"
GT
GHCi> (comparing length <> comparing last <> comparing id) "aac" "abc"
LT

这利用了函数的幺半群实例(结果上的幺半群)和排序的实例(它执行 the intuitvely obvious thing )。

鉴于您提供给比较的投影函数的结果类型实际上并未出现在最终结果中,如果您确实想要一个列表,您可以诉诸存在类型:

{-# LANGUAGE GADTs #-}

import Data.Ord

data Measurement a where
Measurement :: Ord b => (a -> b) -> Measurement a

comparingHet :: Measurement a -> a -> a -> Ordering
comparingHet (Measurement f) = comparing f
GHCi> criteria = [Measurement length, Measurement last, Measurement id]
GHCi> mconcat (comparingHet <$> criteria) "aac" "abc"
LT
GHCi> foldMap comparingHet criteria "aac" "abc" -- Alternative spelling.
LT

或者,您可以使用 Comparison from Data.Functor.Contravariant ,只是稍微不那么整洁:

GHCi> import Data.Functor.Contravariant
GHCi> criteria = Comparison <$> [comparing length, comparing last, comparing id]
GHCi> getComparison (mconcat criteria) "aac" "abc"
LT

关于sorting - 根据异构标准进行 map 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42662178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com