在阅读瓦德尔关于僧mon的论文(并 sections一些部分)之后,我决定通过该文件更加密切地工作,为他所描述的每个僧.确定ctor的遗嘱和参考案例。 使用同义词
type M a = State -> (a, State)
type State = Int
瓦勒用于界定国家僧mon,我有以下(使用相关名字,以便我稍后能够用新的类型声明来界定这些名字)。
fmap :: (a -> b) -> M a -> M b
fmap f m = st -> let (a, s) = m st in (f a, s)
pure :: a -> M a
pure a = st -> (a, st)
(<@>) :: M (a -> b) -> M a -> M b
sf <@> sv = st -> let (f, st1) = sf st
(a, st2) = sv st1
in (f a, st2)
return :: a -> M a
return a = pure a
bind :: M a -> (a -> M b) -> M b
m `bind` f = st -> let (a, st1) = m st
(b, st2) = f a st1
in (b, st2)
当我转向在新的类型声明中使用一种类型构造,例如
newtype S a = S (State -> (a, State))
一切都相距甚远。 一切只是略有改动,例如,
instance Functor S where
fmap f (S m) = S (st -> let (a, s) = m st in (f a, s))
instance Applicative S where
pure a = S (st -> (a, st))
但是,由于lam布达的表述是隐藏在这种建筑内,因此GHC没有发生任何事情。 现在,我看到的唯一解决办法是确定一项职能:
isntThisAnnoying s (S m) = m s
a. 保证金的固定价值和实际收益,例如:
fmap f m = S (st -> let (a, s) = isntThisAnnoying st m in (f a, s))
是否有另一种方式不使用这些辅助职能?