簡體   English   中英

當給出適用的f時,不能推斷(Applicative f0)

[英]Could not deduce (Applicative f0) when Applicative f is given

我無法理解為什么在下面的代碼中有兩個獨立的ff0 Applicative約束(需要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 ,它將編譯,以便上下文可以“統一”。 但我不知道如何與reducer上下文統一。

我的目標是使用Applicative Semigroup foldReduce(如果可能的話),這樣length將被有效版本替換。

標准的解決方案是使用ScopedTypeVariables宣布, f在簽名apmf你想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納入定義體內的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM