[英]Could not deduce (Applicative f0) when Applicative f is given
我無法理解為什么在下面的代碼中有兩個獨立的f
和f0
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
在簽名apm
和f
你想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.