簡體   English   中英

Haskell 中的函數沒有獲取泛型類型參數

[英]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 8wrapped8box使用時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的預期參數匹配,因為IntBox a類型不匹配。

暫無
暫無

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

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