【问题标题】:Haskell : Use -XFlexibleContexts to permit this?Haskell:使用 -XFlexibleContexts 来允许这样做?
【发布时间】:2014-01-27 07:55:23
【问题描述】:

我的代码如下:

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)

错误如下:

非类型变量参数

在约束中:积分(Integral a, Integral b)

(使用 -XFlexibleContexts 允许这样做)

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

失败,已加载模块:无。

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

    :set -XFlexibleContexts
    

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

    {-# LANGUAGE FlexibleContexts #-}
    

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

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

    【讨论】:

    【解决方案2】:

    上下文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)
    

    【讨论】:

    • 您能否添加更多有关如何调试此类错误的信息(发生的情况可能不太明显)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多