我已經定義的類型X
作爲爲什麼我不使用`>> =`而沒有顯式或隱式的定義?
newtype X i o = X { runX :: Int -> i -> IO o }
我已經做的Functor
,Applicative
和Monad
一個實例與
instance Functor (X i) where
fmap f a = X $ \ i o -> liftA f $ runX a i o
instance Applicative (X i) where
pure x = X $ \ _ _ -> return x
a <*> b = X $ \ i o -> liftA2 (<*>) (runX a i o) (runX b i o)
instance Monad (X i) where
return = pure
a >> b = X $ \ i o -> runX a i o >> runX b i o
正如你可能會說,我一直,thusfar,無法來定義爲>>=
,所以排除了它。我預計這會在編譯時出錯,但事實上,它所做的只是提出警告。很好,所以它不檢查一個類的所有方法是否被定義,但當然我實際上不能使用使用>>=
。不,再次錯了。令我非常驚訝的是,GHCi愉快地評估let x = pure 5 >>= pure
。 Control.Monad
不會導出>>=
的默認定義,我當然還沒有定義一個,那麼這怎麼可能?
我不能讓你的'Functor'實例進行類型檢查。它抱怨說它不能與'IO(f0 a)'與'i0 - > IO o0'匹配。 –
發佈的代碼不會編譯(例如它應該是'fmap'定義中的'runX a i o')。也許你在這裏粘貼了一個錯誤的版本? – duplode
這仍然不適用於我,但拿出'liftA'。 –