如何使 GHC.Ptr 成为 Monad 的实例?

问题描述 投票:0回答:1

这是我到目前为止所拥有的:

instance Monad Ptr where
    return = pure
    (>>=) (Ptr t) f = f t 

抛出的错误是:

    • Couldn't match a lifted type with an unlifted type
      When matching types
        a :: *
        GHC.Prim.Addr# :: TYPE 'GHC.Types.AddrRep
    • In the first argument of ‘f’, namely ‘t’
      In the expression: f t
      In an equation for ‘>>=’: (>>=) (Ptr t) f = f t
    • Relevant bindings include
        f :: a -> Ptr b (bound at RegionalMemory.hs:16:19)
        (>>=) :: Ptr a -> (a -> Ptr b) -> Ptr b
          (bound at RegionalMemory.hs:16:5)
   |
16 |     (>>=) (Ptr t) f = f t
   |                         ^

我不太明白这个错误。我在这里做错了什么?

pointers haskell types ghc
1个回答
0
投票

t
不是
a
类型,而是
Addr#
es,所以你不需要。事实上,
Ptr
数据类型定义为
:

data Ptr a = Ptr Addr#
  deriving ( Eq  -- ^ @since base-2.01
           , Ord -- ^ @since base-2.01
           )

a
并没有告诉数据构造函数中包装的值的类型是什么,它告诉了地址指的是什么样的东西。

您可以做的是创建一个与指针和后处理函数一起使用的数据类型,例如:

data ProcPtr a b = ProcPtr (Ptr a) (a -> b)

然后我们可以将其作为

Monad
的实例:

instance Monad (ProcPtr a) where
  return x = ProcPtr (pure x) id
  ProcPtr p f >>= g = ProcPtr p (g . f)
© www.soinside.com 2019 - 2024. All rights reserved.