在Haskell中的函数中实现输入变量

时间:2015-08-13 18:24:31

标签: haskell fizzbuzz

这是我之前post的延续。

我正在创建一个允许输入3个参数的FizzBu​​zz函数。但是,这不仅仅是标准的FizzBu​​zz计划。这个允许2个除数,同时实现上限。因此,如果div1是可分割的打印“Fizz”,如果div2是可分割的打印“嗡嗡声”,并且如果div1div2是可分割的打印“FizzBu​​zz”,则打印数/整数。

我找到了不同的教程,展示了如何在Haskell中执行常规FizzBu​​zz并修改它以便能够如上所述进行。

现在我收到错误,我不确定如何在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.

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题在于fb的类型签名。只需删除它,您的代码就会编译。

fb的正确类型签名为Integer -> Integer -> Integer -> IO (),您可以通过ghci告诉您:t命令来验证:

$ ghci Fizzbuzz.hs
Prelude> :t fb
fb :: Integer -> Integer -> Integer -> IO ()
Prelude>