在Haskell中,是否有一种很好的方法可以将num写入num转换函数`toNum ::(Num a,Num b)=> a - > b`?

wl.*_*wl. 6 haskell numbers typeclass

例如,一种不好的方法是通过一个字符串:

toReadableNum :: (Num a, Num b, Read b) => a -> b
toReadableNum = read . show
Run Code Online (Sandbox Code Playgroud)

如果没有好方法,还有其他不好的方法吗?具体实施?需要语言扩展?

Edw*_*ETT 8

你不能(理智地)NumNum,因为Num没有提供任何机制来提取除了它的虚假Eq和Show机器之外的其他值,但是如果你愿意代表你的数字更多地假设你来自,然后你可以追索.

特别是

fromIntegral :: (Integral a, Num b) => a -> b
Run Code Online (Sandbox Code Playgroud)

和的组成

toRational :: Real a => a -> Rational
Run Code Online (Sandbox Code Playgroud)

fromRational :: Fractional a => Rational -> a
Run Code Online (Sandbox Code Playgroud)

如果不是你所要求的,那么你们都可以做你们的意思.

虽然read . show打字很好并且有你提出的签名,但意思是gobbledigook.没有什么可以说一个Show实例发出的文本将与一个完全不同的Read实例兼容,并且有很多反例.

(隐含)合同Read,Show仅在您使用相同类型时才适用!


aug*_*tss 7

没有好办法.有些数字包含更多其他信息,所以你怎么能期望以一种好的方式在两个任意数字之间进行转换.一些简单的例子:如何将Double转换为Int?对Int8有理由吗?浮动的复杂双重?

所有这些都涉及信息丢失,然后没有明显的正确方法.


正如@hammar所说,这些操作Num根本不允许你构建这样的函数.