Я хочу, чтобы иметь возможность использовать MWC random number generator со случайным fu, и поэтому необходимо реализовать экземпляр MonadRandom
. Моя попытка рассмотреть Reader (Gen (PrimState m)) v
a MonadRandom v
. Однако, следующее терпит неудачу:Запись экземпляра MonadRandom для MWC (Haskell)
$(monadRandom [d|
instance (PrimMonad m) => MonadRandom (Reader (MWC.Gen (PrimState m))) where
getRandomWord16 = ask >>= MWC.uniform
getRandomWord32 = ask >>= MWC.uniform
getRandomWord64 = ask >>= MWC.uniform
|])
с ошибкой:
Illegal type synonym family application in instance:
Reader (MWC.Gen (PrimState m_ahwD))
In the instance declaration for
‘MonadRandom (Reader (MWC.Gen (PrimState m_ahwD)))’
Что я делаю неправильно?
Проблема заключается именно в том, что компилятор сказал вам это: вы не можете иметь типовые семейные приложения в экземпляре. Самый простой способ избавиться от семейства типов в экземпляре * head * - просто поместить его в * context *: 'instance (PrimMonad m, s ~ PrimState m) => MonadRandom (Reader (MWC.Gen s)) '(при условии, что фактический код в противном случае правильный, и, конечно, нет других проблем). Другое решение заменяет «PrimState m» на то, что он представляет, а именно один раз для «IO» и один для «ST s». – user2407038