正如问题的标题所示,我想知道什么是Levity多态性,它的动机是什么? 我知道这个页面里面有一些细节,但是大部分的解释都在我头上。 🙂 虽然这个页面有点友好,但我仍然无法理解它背后的动机。
我经常看到懒惰和非严格不一样,但是我发现很难理解这个差别。 它们似乎可以互换使用,但是我知道它们有不同的含义。 我将不胜感激有助于理解差异。 我有几个分散在这个职位的问题。 我将在这篇文章结尾总结这些问题。 我有几个例子片段,我没有testing它们,只是把它们作为概念呈现出来。 我已经添加了引号,以防止您查找它们。 也许这会在以后同样的问题上帮助别人。 非严格防卫: 函数f被认为是严格的,如果应用于非终止expression式时,它也不能终止。 换句话说,如果f bot的值是| ,则f是严格的 。 对于大多数编程语言,所有function都是严格的。 但在Haskell中并非如此。 作为一个简单的例子,考虑const1,常量1函数,定义如下: const1 x = 1 在Haskell中const1 bot的值是1.在操作上,因为const1不需要它的参数的值,所以它永远不会试图评估它,因此永远不会被捕获到一个非终结的计算。 由于这个原因,非严格函数也被称为“懒惰函数”,并被认为是“懒惰”或“需要”评价他们的论点。 – 对Haskell的一个简单介绍:函数 我非常喜欢这个定义。 这似乎是最好的,我可以find理解严格。 是const1 x = 1懒吗? 非严格意味着减less(评估的math术语)从外部进行, 所以如果你有(a +(b c))那么你先减less+,然后你减less内部(b c)。 – Haskell维基:Lavy vs非严格 Haskell Wiki真的让我困惑。 我明白他们在说什么,但是我不明白(a+(b*c))是如何评价非严格的,如果是通过_|_ ? 在非严格评估中,除非函数实际用于评估函数体,否则不会评估函数的参数。 在教会编码下,运营商的懒惰评估映射到function的非严格评估; 为此,非严格评价通常被称为“懒惰”。 许多语言中的布尔expression式都使用一种非严格评估forms,称为短路评估,只要能够确定将产生一个明确的布尔值就会返回评估结果 – 例如,在遇到真值的分离expression式中,或者在遇到错误的连接expression式等等。 条件expression式通常也使用懒惰评估,只要一个明确的分支会导致评估返回。 – 维基百科:评估策略 懒惰Def: 另一方面,懒惰评价意味着只有在需要结果的时候评价一个expression(注意从“减less”转变为“评价”)。 […]
有没有一个简单的方法来计算Haskell函数执行的时间?
我明白,ST monad就像IO的一个小兄弟,反过来也是joinRealWorld魔法的状态monad。 我可以描绘出状态,我可以想象RealWorld是以某种方式投入到IO中的,但是每次我写ST的types签名时,ST monad的s让我困惑。 以ST s (STArray sab)为例。 它在那里工作? 它只是用来在计算之间build立一些仿真数据依赖关系,而不能像状态monad中的状态那样引用(由于全部)? 我只是抛出想法,会非常感激比我更懂事的人向我解释。
有一件事让我困惑不已,那就是现在是否可以使用IORef。 在决定是否使用IORef来执行任务时,是否有任何指导原则? 什么时候在IORef上使用State Monad?
我已经有几次有GHC告诉我使用扩展的经验,只是发现,当使用扩展时,我已经使代码更加复杂,当一个简单的重构允许我坚持使用Haskell 98(现在2010 ),并有一个更直接的解决scheme。 另一方面,有些时候GADT或Rank2Types(很lessRankNTypes)使得代码less得多,代码更简洁。 哪种扩展通常会掩盖更好的devise的可能性,并且通常会改进它? 如果有两者兼而有之,那么在决定使用该扩展之前,用户应该寻找什么(确定他们打算的解决scheme是真是假)? (另请参阅我应该使用GHC Haskell扩展吗? )
我希望在新项目上使用Haskell或OCaml,因为R太慢了。 我需要能够使用支持vector机器,理想地分离出每个执行并行运行。 我想用一种function性的语言,我觉得就性能和优雅而言,这两者是最好的(我喜欢Clojure,但是在短期testing中速度并不快)。 我倾向于OCaml,因为似乎有更多的支持与其他语言的集成,所以它可能是一个更好的长期合适的(例如OCaml-R )。 有没有人知道这种分析的好教程,或在Haskell或OCaml的代码示例?
我有一个中等大小的应用程序,使用Data.Acid持久性,我遇到了一个情况,我需要更新下一个版本的服务器的一个Update事件的实现。 即我有类似的东西 myUpdate :: Update MyState () myUpdate = <some outdated implementation> 现在,显然我不能随意改变执行方式,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。 我看到我的select是: 停止服务器。 为我的AcidState运行createCheckpoint 。 更新Event实施,然后重新启动服务器。 由于我们从一个新的快照加载,更改的Update不应该触发旧的事件。 使用新名称(如myUpdate_v2 )创build一个新的Update ,并更新我的服务器逻辑,使其只使用myUpdate_v2而不是原始的myUpdate 。 我认为这两种select都有其优点。 (1)更好,因为我不需要保留我的代码库中的旧function,但必须非常小心地为每个更新的服务器执行,否则我会冒损坏数据的风险。 (2)更安全(特别是如果我从模块的输出中删除旧的myUpdate ,所以我可以肯定,我不会意外地在任何地方使用旧的实现),但是它感觉有点难看。 有没有更好的方法来做到这一点? 我认为这是我一定会遇到的一个又一个长期项目,所以我想有一个很好的标准工作stream程来应用对我的事件实施的变化。
到目前为止,我所遇到的每个monad(可以表示为一个数据types)都有一个对应的monad变换器,或者可以有一个。 有没有这样的monad? 还是所有的monad都有相应的变压器? 通过对应于monad m的变换器t ,我的意思是t Identity同构同构于m 。 当然,它符合monad变压器法则,而且对于任何monad n来说都是monad。 我希望看到一个certificate(理想上是有build设性的),即每一个单子都有一个certificate,或者是一个没有certificate的单子的certificate。 我对哈斯克尔导向的答案以及(类别)理论答案都感兴趣。 作为一个后续的问题,是否有一个monad m有两个不同的变换器t1和t2 ? 也就是说, t1 Identity同构于t2 Identity和m ,但是有一个monad n使得t1 n不同构于t2 n 。 ( IO和ST有一个特殊的语义,所以我不考虑它们,让我们完全忽略它们,让我们只关注可以使用数据types构造的“纯”单子。
我正在学习Haskell,并遇到以下代码: fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 这在parsing方面有点麻烦,就其工作原理而言。 这是非常整洁,我明白,没有什么是必要的,但我想了解,当我写的时候,Haskell如何设法“填补”fibs: take 50 fibs 任何帮助? 谢谢!