[英]Function in Haskell not getting generic type parameter
在 Haskell 中,我有以下內容
data Box a = Box a deriving Show
instance Functor Box where
fmap func (Box a) = Box (func a)
box :: Box Int
box = Box 8
wrapped :: Box (Box Int)
wrapped = Box <$> box
unwrap :: (Box a) -> a
unwrap (Box val) = val
在 GHCi 中,我可以使用fmap
unwrap wrapped
調用fmap
並得到Box 8
,這是我所期望的。
*Main> fmap unwrap wrapped
Box 8
當我用fmap
unwrap box
調用fmap
,我收到關於類型不匹配的錯誤,但我想我會得到值 8。
*Main> fmap unwrap box
<interactive>:26:13: error:
• Couldn't match type ‘Int’ with ‘Box b’
Expected type: Box (Box b)
Actual type: Box Int
• In the second argument of ‘fmap’, namely ‘box’
In the expression: fmap unwrap box
In an equation for ‘it’: it = fmap unwrap box
• Relevant bindings include
it :: Box b (bound at <interactive>:26:1)
我原fmap unwrap box
會給出值8
。
我如何定義unwrap
,以便能夠獲得的價值Box 8
的wrapped
和8
對box
使用時fmap
?
我不認為這很重要,但我使用的是 GHCi 8.8.4 版
如果你有一個box = Box 8
並且想要一個普通的8
,你應該只調用fmap unwrap box
unwrap box
,而不是fmap unwrap box
。 一般來說, fmap
永遠不會讓你解包一個值,因為它的類型(Functor f) => (a -> b) -> fa -> fb
指定fmap xy
的結果將具有包裝類型fb
。 讓我們來看看這些類型,看看為什么會發生這種情況:
當我們調用fmap unwrap
,我們可以通過“統一”的類型unwrap
與第一個參數的類型fmap
,這給了我們這種特殊類型的fmap
:
fmap :: (Functor f) => (a -> b) -> f a -> f b
unwrap :: Box a -> a
fmap :: (Functor f) => (Box a -> a) -> f (Box a) -> f a
請注意,因為f
沒有出現在fmap
的第一個參數的fmap
,所以Box
不會填充f
。 然后,我們可以將unwrap
對這個特殊版本fmap
:
fmap unwrap :: (Functor f) => f (Box a) -> f a
這幾乎肯定不是您在這里期望的類型。 當我們將其統一為參數Box (Box 8)
,我們得到專門的類型:
fmap unwrap :: (Functor f) => f (Box a ) -> f a
Box (Box 8) :: Box (Box Int)
fmap unwrap :: Box (Box Int) -> Box Int
但是當我們嘗試將其與參數Box 8
的類型統一時,我們遇到了一個問題:
fmap unwrap :: (Functor f) => f (Box a) -> f a
Box 8 :: Box Int
我無法將Box 8
的類型與fmap unwrap
的預期參數匹配,因為Int
與Box a
類型不匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.