将有理数转换为字符串
Converting rational number to string
我有以下要求:给定一个有理数 (x % y):
- 如果 y != 1 => return "x y"
- 否则: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
并显式调用 numerator
和 denominator
.
差异不大,但更接近您的书面规范(以及更多 "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
是现在写的,那可能会可用。但它是一个旧库,所以如果你想要那个模式同义词,你必须自己写。
我有以下要求:给定一个有理数 (x % y):
- 如果 y != 1 => return "x y"
- 否则: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
并显式调用 numerator
和 denominator
.
差异不大,但更接近您的书面规范(以及更多 "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
是现在写的,那可能会可用。但它是一个旧库,所以如果你想要那个模式同义词,你必须自己写。