在Haskell中导致类似错误的原因是什么?

时间:2016-03-03 20:40:45

标签: haskell typeerror

我正在使用Haskell来评估值表的简单限制。我定义了以下函数:

f :: (Integral a) => a -> a
f x = div 1 $ subtract 6 x

在GHCI中,我let leftSide = [5.90, 5.91..5.99]let rightSide = [6.10,6.09..6.01],然后:

GHCI> map f leftSide

哪个barfs这个错误:

<interactive>:50:5
  No instance for (Integral Double) arising from a use of `f'
  Possible fix: add an instance declaration for (Integral Double)
  In the first argument of `map', namely `f'
  In the expression: map f leftSide
  In an equation for `it': it = map f leftSide

将f的类型声明更改为(Integral Double a) => a -> a会使编译器抱怨`Integral&#39;适用于太多类型的参数。这里发生了什么?

1 个答案:

答案 0 :(得分:4)

我认为你只是尝试了错误的部门 - 你真的希望(/)而不是div ......

您的问题是div需要Integral类型(例如Integer):

Prelude> :t div
div :: Integral a => a -> a -> a

,然后通过Fractional 6.10map

leftSide将其用于rightSide Double,...} >

现在GHCi默认为Double - 但Integral不是(Integral a, Double a) => ...的实例 - 这正是Haskell所抱怨的。

你试过的东西不起作用,我想你想写Double但最后(如果它可以工作 - 它不是因为f :: Double -> Double是类型而不是类型类)它会跟div说话一样 - 这会再次导致错误(因为Double没有(/)

简而言之:使用div代替f :: Fractional r => r -> r f x = (1 /) $ subtract 6 x ,它应该有效:

Prelude> let leftSide = [5.90, 5.91..5.99]
Prelude> map f leftSide
[-10.000000000000036,-11.111111111111128
,-12.49999999999999,-14.285714285714228
,-16.66666666666653,-19.999999999999716
,-24.999999999999424,-33.33333333333207
,-49.999999999996625,-99.99999999998437]

这是你的第一个例子:

f = (1 /) . (6 -)

btw:如果你使用无点,你可以缩短

f x = 1 / (6 - x)

或者如果你写出来更清洁/更易读

count=0

countIt(){

cd "$1"

for d in "$1"; do
 if [ -d $d ]; 
   then
    count=$((count+1))
    countIt "$d"
 fi
done

}