What does % do in Haskell?
我习惯用%在其他语言中表示"模"。在haskell,我们必须使用mod x y或x `mod` y。那么,这个符号在哈斯克尔是用来做什么的?
- 举例说明它的用法。我现在不记得它有什么用途,但是很可能自己定义它,所以库可以定义它。
- 它在Data.Ratio中,见这里:hackage.haskell.org/package/base-4.12.0.0/docs/…(当然,除非在另一个库中有%的另一个定义,这是完全可能的。)
通过快速查看hoogle,可以看到%是一个infix函数,定义为
号
你可以猜到它是Data.Ratio库的一部分,它主要处理比率(即分数)。它是代码是
因此,给定两个积分(x,y),它返回一个不可约分数x/y。
- 从来没听说过胡言乱语。我是哈斯克尔的新手。我通过ddgo搜索,没有一篇文章提到data.ratio。此资源未包含在常规搜索结果中。参见:duckduckgo.com/…
- 有没有办法在ghci/prelude中查找数据的类型定义?我已经试过了,没有用。
- @Ryan,hoogle at haskell.org/hoogle是haskell图书馆的搜索引擎。您可以在这个链接上找到它,然后可以搜索任何函数、一些函数描述和——最重要的——函数类型。如我所说,%是Data.Ratio库的一部分,因此在GHCI(包括:t中)中使用它之前,您需要通过import Data.Ratio导入它。然后你可以看到类型。还请记住,您可以使用:info,它有时会提供比:t更多的信息。
在haskell中,我们可以像普通函数一样用各种符号(包括%)定义二进制运算符,因此您可以(在定义它的模块中)将%定义为所需的任意运算符。
作为最典型的情况,%通过data.ratio模块作为Ratio类型的构造函数提供。
在ghci上尝试下面的代码,以确保%由Data.Ratio提供:
1 2 3 4 5 6 7
| ghci > 3 % 9
<interactive >:1:3: error:
Variable not in scope : (%) :: Integer -> Integer -> t
ghci > import Data.Ratio
ghci > 3 % 9
1 % 3 |
。
请记住,您可以在这些搜索引擎中搜索这些运算符和函数:
- https://www.haskell.org/hoogle网站/
- https://www.stackage.org网站/
实际上,我已经研究过hoogle是如何定义%的。
%中缀函数定义为
号
从上面的类型定义可以看出,它是Data.Ratio库的一部分,它主要处理比率(即分数)。它的代码是
因此,给定两个积分(x,y),它返回一个不可约分数x/y。
在Stackage Hoogle上搜索(%),似乎Data.Ratio将%操作符定义为从分子和分母构造Ratio值。GHCI示例:
Data.Ratio使用%作为构造函数,但除非该类型是在Integral类型类之前定义的,否则它不能解释为什么%可供Data.Ratio使用。(当然,合格的导入允许您在多个模块中使用相同的操作员名称,因此无论哪种方式,Data.Ratio使用的%都不是真正的原因。)
但是,请注意,Integral定义了mod和rem函数。我怀疑%是故意被Integral排除在外的,这两个目的都是为了避免1)选择它是否应该是mod或rem的别名,以及2)让人们记住做出的选择。
另外,语言对%使用不同的定义,因此(%) = mod或(%) = rem都有可能混淆某人。
- 还有一个不错的版本(我想可能是在python中?)这就保证了无论操作数的符号是什么,都能产生积极的结果,同时也保证了q * n + r = m。
- 我相信Python%是haskell mod。
- 呵呵。弄错了。R6RS方案的mod是"欧几里得风格",purescript(以前是knuth风格,但后来被转换了)也是这样。