我正在使用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;适用于太多类型的参数。这里发生了什么?
答案 0 :(得分:4)
我认为你只是尝试了错误的部门 - 你真的希望(/)
而不是div
......
您的问题是div
需要Integral
类型(例如Integer
):
Prelude> :t div
div :: Integral a => a -> a -> a
,然后通过Fractional
6.10
和map
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
}