- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 Haskell 编写了一个密码学库来学习密码学和 monad。 (不用于现实世界!)我用于素性测试的函数类型是
prime :: (Integral a, Random a, RandomGen g) => a -> State g Bool
如您所见,我使用了 State Monad,因此我不会一直让线程通过生成器。素数函数在内部使用依赖于随机数的 Miller-Rabin 测试,这就是素数函数也必须依赖于随机数的原因。这在某种程度上是有道理的,因为 prime 函数只进行概率测试。
仅供引用,下面是完整的 prime 函数,但我认为您不需要阅读它。
-- | findDS n, for odd n, gives odd d and s >= 0 s.t. n=2^s*d.
findDS :: Integral a => a -> (a, a)
findDS n = findDS' (n-1) 0
where
findDS' q s
| even q = findDS' (q `div` 2) (s+1)
| odd q = (q,s)
-- | millerRabinOnce n d s a does one MR round test on
-- n using a.
millerRabinOnce :: Integral a => a -> a -> a -> a -> Bool
millerRabinOnce n d s a
| even n = False
| otherwise = not (test1 && test2)
where
(d,s) = findDS n
test1 = powerModulo a d n /= 1
test2 = and $ map (\t -> powerModulo a ((2^t)*d) n /= n-1)
[0..s-1]
-- | millerRabin k n does k MR rounds testing n for primality.
millerRabin :: (RandomGen g, Random a, Integral a) =>
a -> a -> State g Bool
millerRabin k n = millerRabin' k
where
(d, s) = findDS n
millerRabin' 0 = return True
millerRabin' k = do
rest <- millerRabin' $ k - 1
test <- randomR_st (1, n - 1)
let this = millerRabinOnce n d s test
return $ this && rest
-- | primeK k n. Probabilistic primality test of n
-- using k Miller-Rabin rounds.
primeK :: (Integral a, Random a, RandomGen g) =>
a -> a -> State g Bool
primeK k n
| n < 2 = return False
| n == 2 || n == 3 = return True
| otherwise = millerRabin (min n k) n
-- | Probabilistic primality test with 64 Miller-Rabin rounds.
prime :: (Integral a, Random a, RandomGen g) =>
a -> State g Bool
prime = primeK 64
问题是,在任何需要使用质数的地方,我都必须将该函数转换为单子(monad)函数。即使它看起来不涉及任何随机性。例如,下面是我的以前函数,用于恢复 Shamir 的 secret 共享计划中的 secret 。确定性操作,对吗?
recover :: Integral a => [a] -> [a] -> a -> a
recover pi_s si_s q = sum prods `mod` q
where
bi_s = map (beta pi_s q) pi_s
prods = zipWith (*) bi_s si_s
那时我使用了一个朴素的、确定性的素性测试函数。我还没有重写 recover
函数,但我已经知道 beta
函数依赖于素数,因此它和 recover
也会。两者都必须从简单的非 monadic 函数变成两个 monadic 函数,即使它们使用 State Monad/randomness 的原因确实很深。
我不禁认为所有代码都变得更加复杂,因为它必须是单子(monad)的。我是不是遗漏了什么,或者在 Haskell 中这样的情况下总是如此吗?
我能想到的一个解决方案是
prime' n = runState (prime n) (mkStdGen 123)
并改用 prime'
。该解决方案提出了两个问题。
genPrime
:_
genPrime :: (RandomGen g, Random a, Integral a) => a -> State g a
genPrime b = do
n <- randomR_st (2^(b-1),2^b-1)
ps <- filterM prime [n..]
return $ head ps
问题变成了是否在 genPrime
等之前或之后进行“剪切”。
最佳答案
这确实是对 monad 的有效批评,因为它们是在 Haskell 中实现的。从短期来看,我没有看到比你提到的更好的解决方案,将所有代码切换为 monadic 风格可能是最健壮的,即使它们比自然风格更重量级,而且确实会很痛苦移植大型代码库,但如果您想添加更多外部效果,稍后可能会有所返回。
我认为代数效应可以优雅地解决这个问题,例如:
所有函数都用它们的效果注释 a -> eff b
,然而,与 Haskell 相反,它们都可以像纯函数 a -> b
一样简单地组合(因此这是有效函数的特例,具有空的效果签名)。该语言然后确保效果形成半格,以便可以组合具有不同效果的函数。
在Haskell中似乎很难有这样的系统。 Free(r) monads 库允许以类似的方式组合各种类型的效果,但仍然需要在术语级别明确的 monadic 样式。一个有趣的想法是重载函数应用程序,因此它可以隐式更改为 (>>=)
,但我不知道这样做的原则性方法。主要问题是函数 a -> m b
既被视为在 m
和 codomain b
中具有效果的有效函数,又被视为具有密码域 m b
的纯函数。我们如何推断何时使用 ($)
或 (>>=)
?
在随机性的特殊情况下,我曾经有一个涉及可拆分随机生成器(无耻插件)的相关想法:https://blog.poisson.chat/posts/2017-03-04-splittable-generators.html
关于haskell - 使用 State Monad 将我所有的函数变成 monadic 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54104339/
我正在编写一个简单的有限状态机,并意识到在某些情况下,事件可以将状态变为多个可能的结果。基本上,从状态 A,如果事件 E 发生,状态可能是 C 或 D。 我目前正在使用此处编写的 Javascript
我在 React 中构建了一个应用程序,我在其中一个样板项目中找到了一行。 (state = {}) => state 谁能给我解释一下上面这行是什么意思?它是 javascript ES6 标准。
如何将多个状态变量组合成另一个? 我想通过一些用户交互来更改高度或宽度的值,并相应地更新 View 中的所有内容。所以高度或宽度会改变,面积也会改变。 我想它看起来像这样 @State var wid
我的容器正在通过 redux store 获取状态。 我通过这样的 Prop 将这个状态传递给模态框:示例: render(){ let {team,id} =this.props.data;
您好,我正在尝试使用 map 根据我所在状态的数组渲染选项,但在返回中使用它时我得到未定义 这是数组 this.state = { countries: ["Australia","Brazil"
我想将 this.state.currentPlayer 分配给 this.state.whosPlaying。它抛出错误TypeError:无法读取新板上未定义的属性“currentPlayer”。
我正在实现某种动态工作流程,当达到某个点时,我必须重新加载状态以呈现 HTML 并重新实例化 Controller 才能继续。 我发现我第二次调用 $state.reload() 不起作用。这是期望的
我正在开发一个 flutter 应用程序,并发现状态管理出现意外行为。我创建了一个示例应用来重现该行为,您可以在下面找到代码和日志输出。 该应用程序包含一个简单的 ListView,其中包含 10 个
有人可以举一个简单的例子,其中 state monad 比直接传递 state 更好吗? bar1 (Foo x) = Foo (x + 1) 对比 bar2 :: State Foo Foo bar
我想写类似 $state.go("/spheres/{{$stateParams.sphereId}}/mono/view"); 的内容使用外部 url 而不是状态,但这不起作用:( 现在我明白为什么
我正在使用“angular-ui-tree”:“^2.22.5” 点击执行某事菜单项时出错.. TypeError: this.$state is undefined 如何将对 $state 的引用传
我在elasticsearch中有文本字段,我想在kibana上可视化词云... 第一步,我们需要标记它们,我使用了“标准标记器” ... 使用这种形式的词云可视化结果如下图所示: 但是我需要的是专有
我正在尝试以编程方式在状态之间移动(使用 ui.router),而用户无需单击任何内容。文档位于 http://angular-ui.github.io/ui-router/site/#/api/ui
我想编写像“(event, state) -> state”这样的折叠函数。如果Java中没有任何模式匹配且不可变,我该如何编写它? 最佳答案 我认为您正在寻找 Java 中的函数式编程。 此版本中引
这个问题已经有答案了: What does an exclamation mark before a variable mean in JavaScript (4 个回答) 已关闭 8 年前。 您好,
https://plnkr.co/edit/bOZW1a9u62W1QA6cYjYj?p=preview 预期 登录后,所有 $states 都会初始化,然后单击 Ticker 按钮后,唯一应重新初始
试图决定(针对我的应用程序)在 onPause() 中保存什么以及要保存在 onSaveInstanceState() 中的内容,我梳理了整个 SO 以获得提示和明确的指导方针。 如果我没理解错的话,
在 Javascript 中,当我单击滚动条(页面中出现的任何滚动条)并将鼠标悬停在图像上时,图像再次开始拖动。 图像只能在鼠标按钮按下状态下拖动。 所以我试图通过了解鼠标按钮状态(mousedown
我见过 Maybe和 Either在代码中使用仿函数(和应用)是有道理的,但我很难想出一个 State 的例子。仿函数和应用。也许它们不是很有用,只是因为 State 才存在。 monad 需要一个仿
我非常努力地想围绕 State Monad,但我不明白以下内容: 鉴于 return 的实现和 (>>=) ,当你说 State $ \s ->.... ,在哪里s来自?我的意思是,当你开始表演时 >
我是一名优秀的程序员,十分优秀!