我有一个任务需要利用命令行参数实现一个循环版本的FizzBuzz,比较2个除数和一个数字,如果upBound可被div1整除则打印Fizz,如果upBound可被div2整除则为Buzz,如果不能被div整除则为upBound无论是 . 我已经构建了函数并且能够独立于main函数使用它,但是为了编译,我显然需要main函数,我在下面尝试实现
module Main( main ) where
import System.Environment
fizzBuzz div1 div2 upBound = do if (upBound - 1) > 1
then fizzBuzz div1 div2 (upBound - 1)
else print "";
if mod (upBound - 1) div1 > 0 && mod (upBound - 1) div2 > 0
then print (upBound - 1)
else
print ((if mod (upBound - 1) div1 == 0 then "Fizz" else []) ++ (if mod (upBound - 1) div2 == 0 then "Buzz" else []))
main = do
[div1,div2,upBound] <- getArgs
fizzBuzz div1 div2 upBound
我已经搜索了每个教程和帮助网站,我可以找到,我只是不了解Haskell及其语法来确定究竟出了什么问题 . 目前我在尝试编译时遇到以下错误:
“fizzbuzz.hs:14:9:使用'fizzBuzz'时没有(Integral String)的实例
我的一个例子的预期输出是这样的
fizzbuzz 2 4 6
是
1
Fizz
3
FizzBuzz
5
Fizz
不幸的是,我似乎找不到合适的帮助资源来弄清楚如何解决这个问题,我希望有人可以指出我正确的方向 .
先感谢您 .
1 回答
当你遇到这样的问题时,最好查看所涉及的类型:
fizzBuzz函数接受3个数字并返回IO()动作
getArgs函数的类型为
getArgs :: IO [String]
这意味着在
main
中,div1
的类型为String
;div2
的类型为String
;和upBound
的类型为String
. 您将它们直接传递给fizzBuzz
,但回想一下,它正在期待数字参数!这就是为什么你得到关于(Integral String)
的错误;因为数字参数可以是一类类型中的任何一个,所以's telling you it can'找到String
是它所期望的数字类的成员的证据 .您需要以某种方式将命令行中的字符串解释为数字 . 最简单的方法是
read
方法,其类型为Read a => String -> a
. 这意味着如果您要从字符串中解析的类型是"readable"类型类的成员,则可以使用String
并为您提供该类型的实例 .