为什么Haskell函数不能返回一个列表

时间:2017-10-04 19:31:49

标签: haskell

有什么问题:

partin a = [floor a, a-floor a]

错误:

<interactive>:342:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 16 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In a stmt of an interactive GHCi command: print it

1 个答案:

答案 0 :(得分:7)

如果没有看到你正在做的事情的全部范围,我无法给出一个完整的答案,但这是一个几乎肯定会涉及到的明确问题。你写了

partin a = [floor a, a-floor a]

floor的类型是

floor :: (RealFrac a, Integral b) => a -> b

(-)的类型是

(-) :: Num a => a -> a -> a

由于您使用的是a - floor a,因此您强制a的类型为的实例 RealFrac Integral类。但是,标准库中没有这种类型(并且它没有多大意义)。因此,GHC肯定无法从其非常有限的默认集合中为您选择类型。如果您使用

,事情可能会好很多
partin a = [fromIntegral (floor a), a - fromIntegral (floor a :: Int)]

但请注意,这里有一个 list 并没有多大意义,因为你试图将一个数字分成两个不同类型的组件。

你可能会更好
partin a = (floor a, a - fromIntegral (floor a :: Int))