【发布时间】:2010-10-15 15:13:43
【问题描述】:
我正在尝试在 Haskell 函数中调用“打印输出”函数。
(一个简单的调试消息)。
下面是我的代码和来自编译器 (GHC 6.10) 的错误消息。
我不太明白为什么它将putStr 调用和空数组混为一谈。
空数组是该特定情况的返回值(打印输出的消息实际上现在只是一个存根)。
知道为什么这不起作用吗?
我的代码:
isAFactor :: 整数 -> 整数 -> 布尔 isAFactor x y = x `mod` y == 0 findFactors :: 整数 -> 整数 -> [整数] findFactors 计数器编号 = 让商 = div num 2 在 如果(计数器>商) 然后做 putStrLn ("factorList is : " ++ show quotient) (*** Line 10***) [] else if(isAFactor num 计数器) 然后 [counter] ++ [quotient] ++ findFactors (counter + 1) num 别的 findFactors (counter + 1) 数量来自 ghc 的错误
测试.hs:10:4: 无法匹配预期类型 `[a] -> [Integer]' 针对推断类型‘IO()’ 在表达式中: putStrLn("factorList is :" ++ show quotient) [] 在表达式中: do putStrLn("factorList is :" ++ show quotient) [] 在表达式中: 如果(计数器>商)那么 do putStrLn("factorList is :" ++ show quotient) [] 别的 if (isAFactor num counter) then [counter] ++ [quotient] ++ findFactors (counter + 1) num 别的 findFactors (counter + 1) 数量【问题讨论】:
-
我相信这是因为findFactors是一个纯函数,所以它可以没有副作用(比如IO)。这就是 Haskell 的全部意义所在。不过,我不知道如何调试您的功能。在 C++ 中,我确实一直使用调试日志记录。
-
"do" 并不是你认为的意思。它只是 monad 排序的语法糖;你实际上不能在 Haskell 中“做”任何事情。 :-)