我想大家都已经看过这种(或者至少类似的)问题了,但是我需要问一下,因为我在任何地方都找不到这个问题的答案(主要是因为我不知道我应该找什么)。
我写了这个小脚本,其中printTriangle应该打印出帕斯卡三角形。
我得到了这个输出:
如果有人能解释一下为什么我在这里做的事情不起作用(说实话,我不太确定我在这里到底在做什么;我习惯于命令式语言,而这个整个函数式编程的东西对我来说仍然非常困惑),以及如何以更聪明的方式做到这一点,那就太好了。
提前致谢。
我写了这个小脚本,其中printTriangle应该打印出帕斯卡三角形。
fac = product . enumFromTo 2
binomial n k = (product (drop (k-1) [2..n])) `div` (fac (n-k))
pascalTriangle maxRow =
do row<-[0..maxRow-1]
return (binomialRow row)
where
binomialRow row =
do k<-[0..row]
return (binomial row k)
printTriangle :: Int -> IO ()
printTriangle rows = do row<-(triangle)
putStrLn (show row)
where
triangle = pascalTriangle rows
现在,对于经过训练的眼睛来说可能很明显的原因,但对我来说完全是个谜,当我尝试在ghci中加载它时,会出现以下错误:
Couldn't match expected type `IO t0' with actual type `[[Int]]'
In a stmt of a 'do' expression: row <- (triangle)
In the expression:
do { row <- (triangle);
putStrLn (show row) }
In
an equation for `printTriangle':
printTriangle rows
= do { row <- (triangle);
putStrLn (show row) }
where
triangle = pascalTriangle rows
我想做的是像这样调用printTriangle:
printTriangle 3
我得到了这个输出:
[1]
[1,1]
[1,2,1]
如果有人能解释一下为什么我在这里做的事情不起作用(说实话,我不太确定我在这里到底在做什么;我习惯于命令式语言,而这个整个函数式编程的东西对我来说仍然非常困惑),以及如何以更聪明的方式做到这一点,那就太好了。
提前致谢。
Learn You A Haskell
。这是一本非常有趣且深入的关于 Haskell 及其惯用语的读物。 - Matt Fenwick