首页 文章

在Haskell中调用打印函数

提问于
浏览
0

我有一个任务需要利用命令行参数实现一个循环版本的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 回答

  • 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 并为您提供该类型的实例 .

相关问题