将有理数转换为字符串

Converting rational number to string

我有以下要求:给定一个有理数 (x % y):

  1. 如果 y != 1 => return "x y"
  2. 否则:return"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 并显式调用 numeratordenominator.

差异不大,但更接近您的书面规范(以及更多 "haskellish" 措辞)。

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

如果指定了合适的 pattern synonym,我们可能会丢失 where 子句中的变量:my_show (x :% y) | ...。如果 Data.Ratio 是现在写的,那可能会可用。但它是一个旧库,所以如果你想要那个模式同义词,你必须自己写。