为什么Haskell中的Fractional类型类本身不可订购?

kyl*_*art 2 haskell types

假设我有以下代码:

import Data.List
f :: (Fractional a) => [a] -> Int -> a
f xs n = sort xs !! n
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为sort是类型Ord a => [a] -> [a].这对我来说似乎很奇怪,因为我认为所有Num类型的值都是固有可订购的.要解决此问题,我需要添加一个额外的类型约束(即(Fractional a, Ord a) => [a] -> Int -> a).看看Haskell的文档,从语法/层次角度来看,这是有意义的.

是什么给出了什么?为什么真正的价值是可订购的,而不是分数值?我不明白其理由.

dup*_*ode 8

Fractional不是类型,而是支持实际划分的类型的类型类.那么你的问题就变成为什么Fractional没有Ord作为超类.至于那个,Complex是一个支持分裂的类型的一个很好的反例,但没有合理的总排序,如Willem Van Onsem所建议的代数Fractional类型.