这是我之前post的延续。
我正在创建一个允许输入3个参数的FizzBuzz函数。但是,这不仅仅是标准的FizzBuzz计划。这个允许2个除数,同时实现上限。因此,如果div1
是可分割的打印“Fizz”,如果div2
是可分割的打印“嗡嗡声”,并且如果div1
和div2
是可分割的打印“FizzBuzz”,则打印数/整数。
我找到了不同的教程,展示了如何在Haskell中执行常规FizzBuzz并修改它以便能够如上所述进行。
现在我收到错误,我不确定如何在Haskell中正确执行此操作。
fizzbuzz' :: [(Integer, String)] -> Integer -> String
fizzbuzz' ss n = foldl (\str (num, subst) -> if n `mod` num == 0 then str ++ subst else str ++ "") "" ss
fizzbuzz :: [(Integer, String)] -> Integer -> String
fizzbuzz ss n = if null str then show n else str
where str = fizzbuzz' ss n
fb :: Integer -> Integer -> Integer -> Integer
fb x y z = mapM_ putStrLn $ map (fizzbuzz [(x, "fizz"), (y, "buzz")]) [0..z]
我得到的错误是:
Couldn't match expected type ‘Integer’ with actual type ‘IO ()’
In the expression:
mapM_ putStrLn $ map (fizzbuzz [(x, "fizz"), (y, "buzz")]) [0 .. z]
In an equation for ‘fb’:
fb x y z
= mapM_ putStrLn
$ map (fizzbuzz [(x, "fizz"), (y, "buzz")]) [0 .. z]
Failed, modules loaded: none.
有什么想法吗?
答案 0 :(得分:1)
问题在于fb
的类型签名。只需删除它,您的代码就会编译。
fb
的正确类型签名为Integer -> Integer -> Integer -> IO ()
,您可以通过ghci
告诉您:t
命令来验证:
$ ghci Fizzbuzz.hs
Prelude> :t fb
fb :: Integer -> Integer -> Integer -> IO ()
Prelude>