Что% делает в Haskell? - PullRequest
       13

Что% делает в Haskell?

0 голосов
/ 19 февраля 2019

Я привык использовать% для обозначения «по модулю» на других языках.В Haskell мы должны использовать mod x y или x `mod` y.Итак, для чего этот символ используется в Haskell?

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Data.Ratio использует % в качестве конструктора, но если этот тип не был определен до класса Integral, это не объясняет, почему % было доступным для использования Data.Ratio.(Конечно, квалифицированный импорт позволяет вам использовать одно и то же имя оператора в нескольких модулях, так что в любом случае % используется Data.Ratio на самом деле не причина.)

Обратите внимание, однако, чтоIntegral определяет и mod и rem функции .Я подозреваю, что % был намеренно исключен из Integral, чтобы избежать 1) принятия решения относительно того, должен ли он быть псевдонимом для mod или rem, а также 2) чтобы люди запомнили, какой выбор

Кроме того, языки используют разные определения для %, поэтому либо (%) = mod, либо (%) = rem могут запутать кого-то .

0 голосов
/ 19 февраля 2019

При быстром просмотре Hoogle вы можете увидеть, что % - это инфиксная функция, определенная как

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

, и, как вы можете догадаться, она является частью Data.Ratio библиотека, которая в основном имеет дело с отношениями (то есть: дроби).Это код

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

, таким образом, учитывая два интеграла (x, y), он возвращает неприводимую дробь x / y

0 голосов
/ 19 февраля 2019

В 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

И помните, что вы можете искать такие операторы и функции в этих поисковых системах:

На самом деле я посмотрел, как % определяется Hoogle .

% - это инфиксная функция, определяемая как

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

и из определения типа, приведенного выше, вы можете видеть, что он является частью библиотеки Data.Ratio, которая в основном имеет дело с соотношениями (то есть: дробями).Его код

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

, поэтому, учитывая два интеграла (x, y), он возвращает неприводимую дробь x / y

0 голосов
/ 19 февраля 2019

При поиске (%) в Stackage Hoogle выясняется, что Data.Ratio определяет оператор % как конструирующее значение 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
...