我有一项任务需要使用命令行参数实现FizzBuzz的循环版本,将2个除数与数字进行比较,如果upBound可被div1整除则打印Fizz,如果upBound可被div2整除则为Buzz,如果不是up则为upBound&# 39;可被任何一个整除。我已经构建了这个函数,并且可以独立于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及其语法的了解不足以确定究竟出了什么问题。目前我在尝试编译时遇到以下错误:
&#34; fizzbuzz.hs:14:9:使用&#39; fizzBuzz&#39;&#34;
没有(积分字符串)的实例我的预期输出示例类似于
fizzbuzz 2 4 6
是
1
Fizz
3
FizzBuzz
5
Fizz
不幸的是,我似乎无法找到合适的帮助资源来弄清楚如何解决问题,并希望有人能指出我正确的方向。
提前谢谢。
答案 0 :(得分:1)
当你遇到这种情况时,最好查看所涉及的类型:
fizzBuzz函数需要3个数字并返回IO()动作
getArgs函数的类型为getArgs :: IO [String]
这意味着在main
中,div1
的类型为String
; div2
的类型为String
; upBound
的类型为String
。您将它们直接传递给fizzBuzz
,但回想一下它是期待数字参数!这就是您收到(Integral String)
错误的原因;因为数字参数可以是类型的类中的任何一个,它告诉你它找不到String
是它所期望的数字类成员的证据。
您需要以某种方式将命令行中的字符串解释为数字。最简单的方法是read
方法,其类型为Read a => String -> a
。这意味着如果您要从字符串中解析的类型是“可读”类类型的成员,则可以使用String
并为您提供该类型的实例。