gpt4 book ai didi

list - Haskell处理Maybe列表

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

我对Haskell还是很陌生,不了解如何使用Maybe [a]。通常,我正在编写OOP(VB.NET),在空闲时间,我想学习haskell(不要问为什么;)。

那么,我想做什么?我想读取两个带有数字ID的文件,然后只找出两个文件中都匹配的ID。读取文件不是一件大事,它的工作非常简单。现在,我得到了Maybe[Ids]的两个列表(举一个简单的例子,只需认为ID是Int)。所以我需要的功能看起来像这样

playWithMaybe :: (Maybe [a]) -> (Maybe [Int]) -> [Int]

现在,我想像以前一样访问列表成员
playWithMaybe (x:xs) (y:ys) = undefined

但不幸的是,这是不允许的,GHC对两个列表都说
Couldn't match expected type ‘Maybe [Int]’ with actual type ‘[t0]’

因此,我玩了一会儿,但没有找到访问列表成员的方法。有人可以帮我吗?一点点的解释将是一件很了不起的事情!

最佳答案

为了从另一个方向解决您的问题,我认为您不需要一个处理两个Maybe [a]的函数。忍受我:

从根本上讲,您要执行的操作在两个列表上进行操作,从而为您提供一个新列表,例如,

yourFunction :: [a] -> [a] -> [a]
yourFunction a b = ...

很好,您可以并且应该这样编写 yourFunction。您拥有的数据是 Maybe [a]的事实捕获了一些附加的辅助信息:创建输入列表的操作可能失败了。下一步是将 yourFunction与辅助信息链接在一起。这正是 do表示法的目的,它将纯净的操作(如 yourFunction)与上下文混合(一个输入列表创建可能失败的事实):
playWithMaybe :: Maybe [a] -> Maybe [a] -> Maybe [a]
playWithMaybe maybeA maybeB =
do a <- maybeA -- if A is something, get it; otherwise, pass through Nothing
b <- maybeB -- if B is something, get it; otherwise, pass through Nothing
Just (yourFunction a b) -- both inputs succeeded! do the operation, and return the result

但是事实证明,您可能还需要使用其他类型的上下文(一个简单的上下文,而不是仅捕获“坏事发生”的 Maybe,我们可以使用 Either捕获“坏事发生,这是一个描述回顾一下 playWithMaybe,“ Maybe -ness”仅显示在一个位置,最后一行的 Just。事实证明,Haskell提供了一个通用函数 pure来包装纯值,就像我们从中得到的一样 yourFunction,在最小的上下文中:
playWithMaybe' :: Maybe [a] -> Maybe [a] -> Maybe [a]
playWithMaybe' maybeA maybeB =
do a <- maybeA
b <- maybeB
pure (yourFunction a b)

但是,Haskell也有一个通用类型来抽象上下文的概念,即Monad。这使我们使函数更加通用:
playWithMonad :: Monad m => m [a] -> m [a] -> m [a]
playWithMonad mA mB =
do a <- mA
b <- mB
pure (yourFunction a b)

现在我们有了非常通用的东西,事实证明它是如此通用,已经在标准库中了! (这已经变得非常微妙了,所以不要担心是否还没有意义。)
import Control.Applicative
play :: Monad m => m [a] -> m [a] -> m [a]
play mA mB = liftA2 yourFunction mA mB

甚至
import Control.Applicative
play' :: Monad m => m [a] -> m [a] -> m [a]
play' = liftA2 yourFunction

为什么我突然从Monad切换到Applicative? Applicative与Monad相似,但更通用,因此,如果可以选择,通常最好使用Applicative(类似于我先前选择使用 pure而不是 return的选择)。要获得更完整的解释,我强烈建议您学习Haskell( http://learnyouahaskell.com/chapters),尤其是第11和12章。注意-一定要先阅读第11章!只有掌握了Functor和Applicative之后,Monads才有意义。

关于list - Haskell处理Maybe列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37983339/

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