gpt4 book ai didi

list - 可以实现这个功能吗?

转载 作者:行者123 更新时间:2023-12-04 17:11:11 25 4
gpt4 key购买 nike

我想要一个函数 q类型:

q :: ([b] -> b) -> ([(a, b)] -> (a, b))

它采用一个从列表中选择单个元素的函数,并将该函数提升到从一对列表中选择一对的上下文中(完全忽略对的第一个元素)。

甚至有可能编写这样的函数吗?我一直无法在这方面取得任何进展。

*'lift' 是正确的词吗?

使用示例:如果我有一个函数:
safeMaximum :: b -> [b] -> b

> safeMaximum 18 []
18
> safeMaximum 18 [4,5,1,4,3]
5

然后我想使用 safeMaximum从对列表中获取第二个元素最大的对:
liftedSafeMaximum :: (a, b) -> [(a, b)] -> (a, b)
liftedSafeMaximum val = q val safeMaximum

liftedSafeMaximum ("?", 3) []
> ("?", 3)
liftedSafeMaximum ("?", 3) [("xyz", 1), ("123", 3), ("hi", 2)]
> ("123", 3)

最佳答案

如果您愿意稍微改进选择器函数的定义,您可以使用类似的方法。不是直接从列表中选择一个元素,我们将有一个多态函数,给定一个投影,允许它查看它感兴趣的每个元素的部分,将从列表中选择一个项目。

全部 q那么必须要做的就是给它snd作为要使用的投影。

{-# LANGUAGE Rank2Types #-}

import Data.Ord (comparing)
import Data.List (maximumBy)

q :: (forall c. (c -> b) -> c -> [c] -> c) -> (a, b) -> [(a, b)] -> (a, b)
q select = select snd

safeMaximumOn :: Ord b => (a -> b) -> a -> [a] -> a
safeMaximumOn proj x xs = maximumBy (comparing proj) (x:xs)

liftedSafeMaximum :: Ord b => (a, b) -> [(a, b)] -> (a, b)
liftedSafeMaximum = q safeMaximumOn

这与 a previous answer of mine 的想法基本相同.

关于list - 可以实现这个功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12748055/

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