Haskell:使用-XFlexibleContexts允许这个?

时间:2014-01-27 07:55:24

标签: haskell

我的代码如下:

calcstep ::Integral a => a -> a
calcstep  n = calcstep2 n 0

calcstep2 :: Integral (Integral a, Integral b) => a -> b -> a
calcstep2 1 k = k
calcstep2 n k | odd n = calcstep2 (n/2) (k+1)
              | otherwise = calcstep2 (n*3+1) (k+1)

错误如下:

  

非类型变量参数

     约束中的

:积分(积分a,积分b)

     

(使用-XFlexibleContexts允许此操作)

     

在`calcstep2'的类型签名中:         calcstep2 :: Integral(积分a,积分b)=> a - > b - >一个

     

失败,模块加载:无。

这是什么意思?我该如何解决?

2 个答案:

答案 0 :(得分:12)

ghci中,您可以像这样设置FlexibleContexts

:set -XFlexibleContexts

在源文件的开头,您应该使用:

{-# LANGUAGE FlexibleContexts #-}

在GHC手册中,您可以找到有关using language extensions的更多信息。

无论如何,我认为克里斯的回答更接近你真正想要的。

答案 1 :(得分:12)

上下文Integral (Integral a, Integral b)可能不是你想要的。您希望{/ 1}}更像是

(Integral a, Integral b)