gpt4 book ai didi

haskell - 理解 Haskell pure 和 <$> 的问题

转载 作者:行者123 更新时间:2023-12-03 23:34:44 26 4
gpt4 key购买 nike

学习了Applicative和Monad后,我只是在尝试一些简单的Haskell代码,并且对pure的应用感到困惑。和 <$> .我确实理解这些定义,但在某些特殊情况下,它们似乎有点混淆。

比如说,我希望得到一个函数 foo ,它需要一个 Maybe Int和一个 Maybe [Int] , 并将第一个参数连接到第二个参数。一个典型的定义可能是:

foo :: Maybe Int -> Maybe [Int] -> Maybe [Int]
foo ma mb = (:) <$> ma <*> mb

所以foo (Just 1) (Just [2])会给 Just [1,2] .

但好像pure在这种情况下没有任何意义,无论我多么努力地尝试制作 (:)一个应用的。此外,pure (:) (Just 1)工作方式与 (:) 完全相同会,但怎么可能呢?我想 (:)接受两个参数,所以前一个应该是应用柯里化(Currying)函数?

非常感谢!

最佳答案

Furthermore, pure (:) (Just 1) works in the exactly same manner as (:) does, but how could it be?

因为多态性和实例解析。我们有那个

pure (:) :: Applicative f => f (a -> [a] -> [a])

注意这对任何应用程序是如何工作的f , 不仅适用于 Maybe .

然后我们应用它到(Just 1)哪个(默认后)有类型,比方说,Maybe Int .所以,输入检查我们需要的一切

pure (:) :: Maybe Int -> result

对于一些 result类型。我们可以把上面的写成

pure (:) :: (->) (Maybe Int) result

然后我们尝试推断出什么 f是,寻找解决方案

f (a -> [a] -> [a]) ~ (->) (Maybe Int) result

因此,

f ~ (->) (Maybe Int)
(a -> [a] -> [a]) ~ result

(->) (Maybe Int)是一个应用程序,我们接受这个 f .然后我们得到

pure (:) (Just 1) :: a -> [a] -> [a]    -- AKA result

现在,pure 是什么?在(->) (Maybe Int)应用?

instance Applicative ((->) b) where
pure x = \_ -> x
-- ...

所以,pure简单地丢弃第二个 Just 1参数并返回第一个 (:) .

结论:问题是 pure (:)不必处理您想到的应用程序,Maybe ,但更通用,将搜索任何使代码进行类型检查的应用程序。如果你申请pure (:)对于某事,(->) b实例被选中,第二个参数被丢弃。

pure f y有很大区别(相当于 f )和 pure f <*> y (相当于 f <$> y )。

关于haskell - 理解 Haskell pure 和 <$> 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168333/

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