gpt4 book ai didi

haskell - 这个功能可以吗?

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

findM :: Monad m => (a -> m Bool) -> m [a] -> Maybe (m a)

我无法自己实现。我可以使用一些指针

查找看起来像:
find f as = listToMaybe $ filter f as

所以我尝试了:
findM f as = filterM f as >>= listToMaybe

但它不起作用。

最佳答案

不,这是不可能的。但是,您可以编写一个带有签名的函数:

findM :: Monad m => (a -> m Bool) -> m [a] -> m (Maybe a)

不可能的原因是为了弄清楚 Maybe有构造函数 Just xNothing ,你必须从单子(monad)中获取值(value)。这意味着 Maybe最后必须在 monad 内部,因为通常不可能从 monad 内部提取值。 (毕竟,这就是 monad 的全部意义所在。)

例如,给 findM 签名,你可以写一些明显不正确的函数:
findM :: Monad m => (a -> m Bool) -> m [a] -> Maybe (m a)
findM = magic
anyM :: Monad m => (a -> m Bool) -> m [a] -> Bool
anyM f = isJust . findM f
extractBool :: Monad m => m Bool -> Bool
extractBool = anyM id . liftM (:[])

函数 extractBool显然是不可能的,所以 findM不能有那个签名。

这是 findM 的实现:
findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
findM _ [] = return Nothing
findM f (x:xs) = do y <- f x
if y then return (Just x) else findM f xs

我不确定实现它的更简单方法——这看起来相当干净,它适用于无限列表。

使用 m [a] 更改签名使用 [a]使其更有用且更易于使用。如果您同时实现这两个接口(interface),您将很快找出原因。

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

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