Преобразование рационального числа в строку - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующие требования: дано рациональное число (x% y):

  1. Если y! = 1 => вернуть «xy»
  2. В противном случае: вернуть «x» "

Работает следующая функция:

import Data.Ratio

my_show :: (Integral a, Show a)  => (Ratio a) -> String
my_show rat = let x = numerator rat
                  y = denominator rat in
                if y /= 1 then (show x) ++ " " ++ (show y) else show x

Можно ли сделать ее более элегантной? Например, я видел в источниках Data.Ratio, что он использует некоторые обозначения для входов функций: (x:%y), но у меня это не сработало. Поэтому я должен использовать let и явно вызывать numerator и denominator.

1 Ответ

5 голосов
/ 04 апреля 2020

Не существенная разница, но немного ближе к вашей письменной спецификации (и больше формулировка "haskelli sh").

my_show r | y /= 1    = show x ++ " " ++ show y
          | otherwise = show x
    where
    x = numerator r
    y = denominator r

Мы можем потерять переменные в предложении where, если подходит были указаны синонимы : my_show (x :% y) | .... Если бы Data.Ratio было написано в наше время, то, вероятно, было бы доступно. Но это старая библиотека, поэтому, если вы хотите использовать этот синоним шаблона, вам придется написать его самостоятельно.

...