gpt4 book ai didi

haskell - 给出 Applicative f 时无法推断 (Applicative f0)

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

我无法理解为什么下面的代码中有两个独立的 ff0 应用约束(需要 reducers 包)。

import Data.Semigroup.Applicative
import Data.Semigroup.Reducer
import Data.Semigroup

-- | Foo
--
-- >>> getMax $ foo ["abc","a","hello",""]
-- 5
foo :: [String] -> (Max Int)
foo = foldReduce . map (length)

bar :: (Foldable f, Monoid m, Reducer e m) => f e -> m
bar = foldReduce

m :: Max Int
m = unit (2 :: Int)

apm :: (Applicative f) => Ap f (Max Int)
apm = unit $ pure (2 :: Int) -- ambiguous Applicative!

我认为我需要以某种方式告诉我我想要 f0 ~ f,其中 f0 是通过使用 pure 独立推断的。

我试图简化:

u :: (Applicative f, Monoid m) => e -> Ap f m
u = undefined

m :: (Applicative f) => Ap f (Max Int)
m = u $ (pure (2 :: Int))

一旦将e 更改为fe,它就会编译,以便上下文可以“统一”。但是不知道怎么统一with reducer上下文。

我的目标是使用 Applicative Semigroup 进行 foldReduce(如果可能的话),以便 length 将被替换为有效版本。

最佳答案

标准的解决方案是使用ScopedTypeVariables声明apm的签名中的ff 你希望 pure 产生相同的 f。所以:

{-# LANGUAGE ScopedTypeVariables #-}
import Data.Semigroup.Applicative
import Data.Semigroup.Reducer
import Data.Semigroup

apm :: forall f. Applicative f => Ap f (Max Int)
apm = unit (pure 2 :: f Int)

不要丢失forall;将 f 引入定义主体的范围是扩展的要求。

关于haskell - 给出 Applicative f 时无法推断 (Applicative f0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50220843/

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