2014-01-27 26 views
1

我的代碼如下:Haskell:使用-XFlexibleContexts來允許這個?

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) 

誤差如下:

非型可變參數

在約束:積分(積分一,積分B)

(使用-XFlexibleContexts來允許)

在類型簽名對於'calcstep2': calcstep2 ::積分(積分a,積分b)=> a - > b - > a

失敗,加載模塊:無。

這是什麼意思?我該如何解決它?

回答

11

上下文Integral (Integral a, Integral b)可能不是你想要的。更有可能你想(Integral a, Integral b)

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

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

ghci你可以設置FlexibleContexts這樣的:

:set -XFlexibleContexts 

在源文件中,在開始時,你應該使用:

{-# LANGUAGE FlexibleContexts #-} 

在GHC手冊,你可以找到更多關於using language extensions

無論如何,我認爲克里斯的答案更接近你真正想要的。

相關問題