在Haskell中,% 运算符的作用是什么?

8 浏览
0 Comments

在Haskell中,% 运算符的作用是什么?

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

0
0 Comments

在Haskell中,%运算符是用来构造一个Ratio(比例)值,从一个分子和一个分母。根据在Stackage Hoogle上的搜索结果,可以找到这个操作符在Data.Ratio模块中的定义。下面是一个在GHCi中的示例:

Prelude> :m + Data.Ratio

Prelude Data.Ratio> let x = 1 % 2

Prelude Data.Ratio> x

1 % 2

Prelude Data.Ratio> :t x

x :: Integral a => Ratio a

上述示例中,我们首先导入Data.Ratio模块,然后使用%运算符创建了一个Ratio值x,其分子为1,分母为2。接着,我们打印了x的值,结果为1%2。最后,我们使用:t命令查看了x的类型,可以看到x的类型为Integral a => Ratio a。

所以,%运算符的作用是构造一个Ratio值,用于表示有理数。它的使用方法是将分子和分母用%连接起来,中间没有空格。这个操作符在Haskell中非常有用,特别是在处理有理数的情况下。

0
0 Comments

在Haskell中,我们可以像普通函数一样使用各种符号(包括%)来定义二元运算符,所以你可以在定义它的模块中将%定义为任意你想要的运算符。

最典型的情况是,%作为Ratio类型的构造函数由Data.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

还记得你可以在以下搜索引擎中搜索这些运算符和函数:

- https://www.haskell.org/hoogle/

- https://www.stackage.org/

实际上,我查了一下%是如何被Hoogle定义的。

%是一个中缀函数,定义如下:

(%) :: Integral a => a -> a -> Ratio a

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

x % y = reduce (x * signum y) (abs y)

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

0
0 Comments

在Haskell中,%是一个中缀函数,它是在Data.Ratio库中定义的。该库主要处理比例(即分数)。它的代码是x % y = reduce (x * signum y) (abs y),给定两个整数(x,y),它返回一个不可约分数x/y。

然而,有些人对Hoogle不太熟悉,特别是对Haskell新手来说。他们可能会通过其他搜索引擎搜索有关%的信息,但很少有文章提到Data.Ratio库。这个资源在一般的搜索结果中也没有包含。

那么如何在GHCi/Prelude中查找Data.Ratio的类型定义呢?可以尝试使用命令":t %",但结果可能不尽如人意。

实际上,Hoogle是一个Haskell库的搜索引擎,可以在haskell.org/hoogle上访问它。你可以在那个链接上搜索任何函数,查看函数描述和函数类型。正如之前提到的,%是Data.Ratio库的一部分,所以在你可以在GHCi中使用它之前,包括":t"命令之前,你需要导入它,即使用"import Data.Ratio"命令。然后你就可以看到它的类型了。另外,你还可以使用":info"命令,有时它会给你比":t"更多的信息。

0