在Haskell中调用打印函数

时间:2016-03-09 01:30:03

标签: haskell

我有一项任务需要使用命令行参数实现FizzBu​​zz的循环版本,将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; fizzBu​​zz&#39;&#34;

没有(积分字符串)的实例

我的预期输出示例类似于

  

fizzbuzz 2 4 6

1
Fizz
3
FizzBuzz
5
Fizz

不幸的是,我似乎无法找到合适的帮助资源来弄清楚如何解决问题,并希望有人能指出我正确的方向。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

当你遇到这种情况时,最好查看所涉及的类型:

  • fizzBu​​zz函数需要3个数字并返回IO()动作

  • getArgs函数的类型为getArgs :: IO [String]

这意味着在main中,div1的类型为String; div2的类型为String; upBound的类型为String。您将它们直接传递给fizzBuzz,但回想一下它是期待数字参数!这就是您收到(Integral String)错误的原因;因为数字参数可以是类型的中的任何一个,它告诉你它找不到String是它所期望的数字类成员的证据。

您需要以某种方式将命令行中的字符串解释为数字。最简单的方法是read方法,其类型为Read a => String -> a。这意味着如果您要从字符串中解析的类型是“可读”类类型的成员,则可以使用String并为您提供该类型的实例。