MonadBaseControl IO ... StateT实现

时间:2015-11-06 02:01:27

标签: haskell monads monad-transformers

我正试图弄清楚如何为类型Foo实现MonadBaseControl的实例,这是一个围绕StateT实例的newtype包装器。你会认为它会像this那样实现,但似乎并非如此。我假设状态块在这里导致问题,那么有没有办法放弃它?

代码:

y

错误:

x <- c(3,7,9)
y <- 20

possible <- y %/% x
#[1] 6 2 2

out <- unique(sequence(possible) * rep(x,possible))
# or alternatively
# out <- unique(unlist(Map(function(a,b) sequence(a) * b, possible, x)))
out
#[1]  3  6  9 12 15 18  7 14
sum(out)
#[1] 84

1 个答案:

答案 0 :(得分:8)

为了避免UndecidableInstances,链接的答案扩展了一个类型系列,为了人类的可读性,它真的不应该有。即,他写道

instance MonadBaseControl IO Foo where
    type StM Foo a = a

而有人可能会考虑写

instance MonadBaseControl IO Foo where
    type StM Foo a = StM (ReaderT Int IO) a

更清楚地说明如何为给定的newtype包装选择正确的右侧。通过类似的更改(和UndecidableInstances),您的代码可以正常工作。如果你想避免UndecidableInstances,你可以在链接的答案中完成相同的扩展;询问ghci扩展应该是这样的一个例子:

> :kind! forall a. StM (StateT Int IO) a
forall a. StM (StateT Int IO) a :: *
= (a, Int)

因此对StateT Foo版本的instance MonadBaseControl IO Foo where type StM Foo a = (a, Int) 我们也可以写:

SonataAdminBundle::standard_layout.html.twig