-1

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

  1. 如果 y != 1 => 返回 "x y"
  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),但它对我不起作用。所以我必须使用letand 显式调用numeratorand denominator

4

1 回答 1

5

没有显着差异,但稍微接近您的书面规范(以及更“haskellish”的措辞)。

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是现在写的,那可能是可用的。但它是一个旧库,所以如果你想要那个模式同义词,你必须自己写。

于 2020-04-04T01:30:07.030 回答