在Haskell中%做了什么?

Rya*_*yan 1 haskell modulo

我习惯使用%来表示其他语言中的"modulo".在Haskell中,我们必须使用mod x yx `mod` y.那么,Haskell中使用的这个符号是什么?

Lor*_*nzo 12

快速查看Hoogle,您可以看到这%是一个定义为的中缀函数

(%) :: Integral a => a -> a -> Ratio a
Run Code Online (Sandbox Code Playgroud)

而你可以猜测它是Data.Ratio图书馆的一部分,它主要处理比率(即:分数).这是代码

x % y = reduce (x * signum y) (abs y)
Run Code Online (Sandbox Code Playgroud)

因此给定两个积分(x,y),它返回不可约分数x/y


Yuj*_*oto 6

在Haskell中,我们可以%像普通函数一样定义具有各种符号(包括)的二元运算符,因此您可以将其定义%为您想要的任意运算符(在您定义它的模块中).

作为最典型的情况,由Data.Ratio模块%作为Ratio类型的构造函数提供.

尝试下面的GHCi代码,以确保%提供Data.Ratio:

ghci> 3 % 9

<interactive>:1:3: error:
    Variable not in scope: (%) :: Integer -> Integer -> t
ghci> import Data.Ratio
ghci> 3 % 9
1 % 3
Run Code Online (Sandbox Code Playgroud)

请记住,您可以在这些搜索引擎中搜索此类运算符和函数:

实际上我已经查询了Hoogle如何%定义.

%是定义为的中缀函数

(%) :: Integral a => a -> a -> Ratio a
Run Code Online (Sandbox Code Playgroud)

从上面的类型定义中,您可以看到它是Data.Ratio库的一部分,它主要处理比率(即:分数).它的代码是

x % y = reduce (x * signum y) (abs y)
Run Code Online (Sandbox Code Playgroud)

因此给定两个积分(x,y),它返回不可约分数x/y