gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

Yet Another Haskell Tutorial中Exercise 3.10的答案

因为是刚开始看  haskell  所以很多概念不是很清楚,比如何时用  do  、“  <-  ”和  let   Exerceise3.10  算是做出来,但是肯定不是一个好办法。希望给我改改吧,顺便解答一下我的疑问。不得不说的是编译信息相当地没有用啊,这真是太遗憾了。

module Main

   where

   

import IO

 

main = do

   list <- askForNumber

   let 

      sAdd = show (foldl (+) 0 list)

      sMul = show (foldl (*) 1 list)

   putStrLn ("The sum is " ++ sAdd)

   putStrLn ("The production is " ++ sMul)

   putFactorial list

          

askForNumber = do

   putStrLn "Give me a number (or 0 to top):"

   sNum <- getLine

   let num = read sNum

   if num == 0

      then return []

      else do

          rest <- askForNumber

          return (num : rest)

          

putFactorial [] = do

   putStr ""

   

putFactorial (x : rest) = do

   let fact = factorial x

   putStrLn ((show x) ++ " factorial is " ++ (show fact))

   putFactorial(rest)

 

factorial 1 = 1

factorial x = x * factorial (x-1)

posted on 2008-09-27 19:28 gyn_tadao 阅读(516) 评论(4)  编辑 收藏 引用 所属分类: Haskell

评论

# re: Yet Another Haskell Tutorial中Exercise 3.10的答案 2008-10-28 09:05 flw

你看不懂编译信息是因为你没有掌握 Haskell 的类型系统。
掌握了类型系统之后,Haskell 的编译信息还是很有用的。

你的程序写得很不错!只是有些地方不太地道。
比如 putStrLn ("The sum is " ++ sAdd) 可以写作 putStrLn $ "The sum is " ++ sAdd。

欢迎到 Haskell@ChinaUnix.net 来交流,在这里回复帖子不太方便。

http://bbs.chinaunix.net/forum-142-1.html  回复  更多评论   

# re: Yet Another Haskell Tutorial中Exercise 3.10的答案 2008-11-25 15:53 Magicloud

do这块我也迷惑了一阵。yaht的最后给出了解释。好像是第九章,你可以查看一下,关于>>=的定义。  回复  更多评论   

# re: Yet Another Haskell Tutorial中Exercise 3.10的答案 2008-11-27 23:30 zzz

楼主写的不错也:)
也可以这样写:
putFactorial list = mapM_ (\x-> putStrLn $ (show x) ++ " factorial is " ++ (show $ factorial x)) list

factorial n = product [1..n] --呵呵,偷懒

factorial n = factorial' n 1

factorial' m c =
if m == 1
then c
else factorial' (m-1) (m*c) --尾递归也。

factorial还可以写成cps的,hehe.


  回复  更多评论   

# re: Yet Another Haskell Tutorial中Exercise 3.10的答案 2008-11-27 23:57 zzz

-- cps版本的factorial,看来的,当初看到这个cps的factorial时候,终于理解了cps,呵呵

factorial n k =
if n == 0
then k 1
else factorial (n - 1) (\x -> k (n * x))

factorial' n = factorial n id  回复  更多评论   

只有注册用户登录后才能发表评论。
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿(14)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜