我是Haskell的新手,为了熟悉它,我做了一些基本的代码katas。目前,我正在进行Kata Potter,我有以下代码片段,我不知道其中有什么错误。
import Test.Hspec
priceOf :: [Int] -> Int
priceOf xs = 8 * (length xs)
main :: IO ()
main = hspec $ do
describe "Harry Potter book prices" $ do
context "Simple discounts" $ do
it "should apply a discount to two different books" $ do
priceOf [0, 1] `shouldBe` 0.95 * 8 * 2
当尝试使用cabal运行它时,它最终会抛出以下错误
No instance for (Fractional Int) arising from the literal '0.95'
In the first argument of '(*)', namely '0.95'
In the first argument of '(*)', namely '0.95 * 8'
In the second argument of 'shouldBe', namely '0.95 * 8 * 2'
在这里进一步阅读类似主题以及关于Haskell wiki上Converting numbers
的章节,我发现了fromIntegral
功能,但仍然没有得到它,我不会&#39 ;知道在Haskell中应该如何在不同类型之间应用基本算术的正确方法。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:7)
此处的问题是(从错误消息中推断)priceOf
会返回Int
,而0.95 * 8 * 2
的多态类型为Fractional a => a
,shouldBe
为迫使这些类型相同。但是Int
不是Fractional
类型,因此您获得了Fractional Int
"没有实例。
解决这个问题的方法:
priceOf
返回Fractional
类型,例如Double
或0.95 * 8 * 2
,Int
或round
之一将floor
转换为ceiling
。