如何编写一个 Haskell 程序来打印指定数字的素数?

Posted

技术标签:

【中文标题】如何编写一个 Haskell 程序来打印指定数字的素数?【英文标题】:How do I write a Haskell program that prints out the prime factors of a specified number? 【发布时间】:2017-04-24 10:15:04 【问题描述】:

这是我到目前为止所拥有的,我很确定函数本身是正确的,但我对在 main = do 块中做什么感到困惑。 我得到的错误是该函数需要一个整数,但我给它一个字符串。我假设它与 getLine 部分有关,而且我没有检查输入的数字是否为 int。

factors :: Int -> [Int]
factors n = [x | x <- [1..n], mod n x == 0]
primeFactors :: Int -> [Int]
primeFactors n = [x | x <- [1..n], mod n x == 0, isPrime x]
isPrime x = (length (factors x)) == 2
main = do
  putStrLn "Enter a number."
  number <- getLine
  let x = factors number
  putStrLn x

我在运行这段代码时遇到的错误:

primeFactor.hs:9:19: 错误:

• 无法将类型“[Char]”与“Int”匹配 预期类型:Int 实际类型:字符串 • 在‘factors’的第一个参数中,即‘number’ 在表达式中:因子数 在“x”的等式中:x = 因子数

primeFactor.hs:10:12: 错误:

• 无法将“Int”类型与“Char”匹配 预期类型:字符串 实际类型:[Int] • 在‘putStrLn’的第一个参数中,即‘x’ 在“do”块的 stmt 中:putStrLn x 在表达式中: do putStrLn "输入一个数字。"; 数字

【问题讨论】:

请在您的问题中包含实际的错误消息,而不是提供释义或删节版本。它们真的很有用。您在评论中询问的错误消息是因为 putStrLn 想要一个字符串,而 x 是一个 Ints 列表,而不是一个字符串。 谢谢,我是这个网站的新手,我会记住这一点,以备将来的问题 【参考方案1】:
let x = factors $ (read number :: Int)
print x

number <- readLn

(感谢@Daniel)

这应该可以完成工作。

【讨论】:

它修复了 1 个错误,但我仍然收到“无法将 'Int' 类型与 'Char' 预期类型匹配:字符串,实际类型:[Int] @Tyler ...或者您可以为此派生Show...如果您愿意 是的,我注意到在我发布评论后,它现在可以工作了,谢谢你们的帮助!

以上是关于如何编写一个 Haskell 程序来打印指定数字的素数?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用haskell中的长度函数?

如何在 Haskell 递归调用中打印迭代?

Haskell拓展篇:斐波那契数列

zzuli oj 1108 打印数字图形

如何使用haskell类型系统来描述关系,从而防止出现更多错误

如何在 haskell 中打印列表?