是什麼在Haskell的方式來表達類似:哈斯克爾錄音功能限制
data SinkBuilder
{ openSink :: MonadIO m => m Sink
}
data Sink = Sink
{ writeSink :: MonadIO m => Value -> m()
, closeSink :: MonadIO m => m()
}
我想我需要的是一組功能,它方便地在數據類型「捆綁」在一起,所以這個數據類型是創造和傳遞作爲一件事?
這似乎是組成原因是有用的,例如,我可以實現類似
(:+:) :: SinkBuilder -> SinkBuilder -> SinkBuilder
a :+: b = SinkBuilder $ do
sa <- openSink a
sb <- openSink b
return $ Sink (\v -> writeSink sa >> writeSink sb) (closeSink sa >> closeSink sb)
它不工作,因爲我不能對錄音功能的限制,但它也看起來非常難看,所以我很確定應該有一個更好的方法來做到這一點。
是不是'MonadIO m => m sink'相當於'IO Sink'? – Michael
@Michael我認爲他們是等價的,如果'm'被普遍量化。 – chi
不是一個等價物,我有我自己的monad,它是MonadIO。 此外,我想有更多的約束,例如'(MonadIO m,MonadState MyState m)=> ...' –