gpt4 book ai didi

haskell - 使用来自 `apply` 的 `MyApplicative ((,) e)`

转载 作者:行者123 更新时间:2023-12-03 14:15:14 25 4
gpt4 key购买 nike

鉴于以下内容,取自 Typeclassopedia :

class MyApplicative f where
pure :: a -> f a
ap :: f (a -> b) -> f a -> f b

instance Monoid e => MyApplicative ((,) e) where
pure x = (mempty, x)
(u, f) `ap` (v, x) = (u `mappend` v, f x)

我正在尝试执行以下操作:
ghci> (+) <$> Control.Applicative.pure 100 <*> Control.Applicative.pure 50
150

但是,使用新定义的 Applicative :
ghci> Main.pure (+ 100) `ap` (Main.pure 50)

<interactive>:132:1:
No instance for (MyApplicative f0) arising from a use of `it'
The type variable `f0' is ambiguous
Note: there is a potential instance available:
instance Monoid e => MyApplicative ((,) e)
-- Defined at MonoidWork.hs:8:10
In the first argument of `print', namely `it'
In a stmt of an interactive GHCi command: print it

查看类型:
ghci> :t Main.pure (+ 100)
Main.pure (+ 100) :: (MyApplicative f, Num a) => f (a -> a)


ghci> :t (Main.pure 50)
(Main.pure 50) :: (MyApplicative f, Num a) => f a

我不明白如何修复编译时错误。

最佳答案

你只需要给它一个类型签名。 GHC/GHCi 有一些特殊的规则来默认某些类型类来提供帮助,特别是当你在 GHCi 中时。否则你必须做类似 1 + 2 :: Int 的事情所有的时间,而不仅仅是 1 + 2 .如果你给它一个类型签名,它就可以正常工作:

> Main.pure (+ 100) `ap` Main.pure 50 :: ((), Int)
((), 150)

GHC 只是没有您自己定义的类型类的默认规则(并且允许这种行为很难正确,否则您的程序中会出现非常意外的结果)。

关于haskell - 使用来自 `apply` 的 `MyApplicative ((,) e)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30021325/

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