这是我到目前为止所拥有的:
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
| ^
我不太明白这个错误。我在这里做错了什么?
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)