- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试写mfix
向下使用 Control.Arrow.loop
.我想出了不同的定义,想看看哪个是 mfix
的实际工作类似。
因此,我认为正确的解决方案如下:
mfix' :: MonadFix m => (a -> m a) -> m a
mfix' k = let f ~(_, d) = sequenceA (d, k d)
in (flip runKleisli () . loop . Kleisli) f
可以看到,
loop . Kleisli
的论点适用于
Applicative
实例。我发现这是一个好兆头,因为我们的打结大多被
(>>=)
破坏了。的严格性在正确的论点。
mfix
完全一样,但我发现的唯一情况不是很自然。看一看:
mfix'' k = let f ~(_, d) = fmap ((,) d) (return d >>= k)
in (flip runKleisli () . loop . Kleisli) f
据我了解,并非所有严格的右手绑定(bind)都完全强制其论点。例如,如果是
IO
:
GHCi> mfix'' ((return :: a -> IO a) . (1:))
[1,1,1,1,1,Interrupted.
所以,我决定解决这个问题。我刚拍了
Maybe
并强制
x
在
Just x >>= k
:
data Maybe' a = Just' a | Nothing' deriving Show
instance Functor Maybe' where
fmap = liftM
instance Applicative Maybe' where
pure = return
(<*>) = ap
instance Monad Maybe' where
return = Just'
Nothing' >>= k = Nothing'
Just' x >>= k = x `seq` k x
instance MonadFix Maybe' where
mfix f = let a = f (unJust' a) in a
where unJust' (Just' x) = x
unJust' Nothing' = errorWithoutStackTrace "mfix Maybe': Nothing'."
我们手上有这个:
GHCi> mfix ((return :: a -> Maybe' a) . (1:))
[1,1,1,1,1,Interrupted.
GHCi> mfix' ((return :: a -> Maybe' a) . (1:))
[1,1,1,1,1,Interrupted.
GHCi> mfix'' ((return :: a -> Maybe' a) . (1:))
Interrupted.
所以,这是我的问题:
mfix''
不是mfix
? Maybe'
,mfix'
不完全是mfix
那我有没有发现? IO
的小注解:
mfix3 k' =
let
k = return . k'
f ~(_, d) = fmap ((,) d) (d >>= k)
in (join . flip runKleisli () . loop . Kleisli) f
不要担心所有
return
s 和
join
s - 他们来这里只是为了拥有
mfix3
的和
mfix
的类型匹配。这个想法是我们通过
d
本身而不是
return d
到
(>>=)
在右手边。它为我们提供了以下信息:
GHCi> mfix3 ((return :: a -> IO a) . (1:))
Interrupted.
然而,例如
(感谢 Li-yao Xia 的评论) :
GHCi> mfix3 ((return :: a -> e -> a) . (1:)) ()
[1,1,1,1,1,Interrupted.
\ ~(_, d) -> ...
,而不是 \ (_, d) -> ...
.
最佳答案
这是部分答案,我希望总比没有答案好。
Is there any other example which could show that mfix'' is not totally mfix?
mfix''
来自
mfix
也可以通过制作
return
严格而不是
(>>=)
.
Are monads with such a strict bind, like Maybe', interesting in practice?
Monad
的
Map
和
IntMap
实例,而
Monad
的
Seq
实例在序列的元素中是惰性的) .
(return x >>= k) = k x
对于
x = undefined
.
Are there any examples which show that
mfix'
is not totallymfix
that I have not found?
loop
的定义在标准库中,根据
mfix
,那么我认为
mfix' = mfix
,尽管我无法完成证明(我可能错过了一个好技巧,或者缺少 MonadFix 定律)。
mfix'
的定义以及标准库对
loop
的定义小心地将参数函数扩展为更惰性(分别使用惰性模式(
~(_, d)
)和
snd
;这两种技术是等效的)。
mfix
和
mfix'
如果恰好放弃其中一项预防措施,它们仍然是相等的。如果两者都被删除,则会出现不匹配 (
mfix /= mfix'
)。
关于haskell - 不使用 monadic bind 使用循环写下 mfix 的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63093464/
我是 UML 建模新手,我需要写下作为浮点元组列表的类的属性。属性部分需要多详细?以下是用于进一步说明的代码示例: # floats x1 = 1.0 y1 = 1.0 x2 = 1.1 y2 = 1
我正在尝试从 Bokeh 图中写入选定的数据点。这个想法是每当单击 Button 时访问 ColumnDataSource selected 属性即可获取选定的数据点。 下面是我想要实现的功能的模型。
我怎样才能创建一个交互函数,以交互方式从用户那里读取一个键(比如当你按下 C-h k 时),然后像这样写一些行: (global-set-key (kbd "C-x C-s") 'hello) 其中“
我试着写下 joinArr :: ??? a => a r (a r b) -> a r b . 我想出了一个使用 app 的解决方案,因此缩小 a下至 ArrowApply的: joinArr ::
我是一名优秀的程序员,十分优秀!