代码之家  ›  专栏  ›  技术社区  ›  Mohan Narayanaswamy

是否可以使用WinHugs打印Haskell中的所有缩减?

  •  6
  • Mohan Narayanaswamy  · 技术社区  · 17 年前

    teneven =  [x | x <- [1..10], even x]
    

    Main> teneven
    [2,4,6,8,10] :: [Integer] 
    (63 reductions, 102 cells)
    

    有没有打印所有的削减。。所以我可以了解WinHugs内部的核心评估?

    3 回复  |  直到 10 年前
        1
  •  5
  •   A. Rex    16 年前

    一些想法:

    1. :set +d 在Hugs中)提供了信息,但非常冗长,并且没有显示Haskell语法的简化。

    2. 尝试 Hat - the Haskell Tracer

      main = {IO}
      teneven = [2,4,6,8,10]
      _foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
      (\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
      (\..) 2 [4,6,8,10] = [2,4,6,8,10]
      (\..) 3 [4,6,8,10] = [4,6,8,10]
      (\..) 4 [6,8,10] = [4,6,8,10]
      (\..) 5 [6,8,10] = [6,8,10]
      (\..) 6 [8,10] = [6,8,10]
      (\..) 7 [8,10] = [8,10]
      (\..) 8 [10] = [8,10]
      (\..) 9 [10] = [10]
      (\..) 10 [] = [10]
      

      那里的lambda是 even . 此外,如果您愿意,Hat还可以跟踪 foldr 和其他内部电话;默认情况下,它不会这样做。

        2
  •  5
  •   Juan Antonio Cano    15 年前

    这里有几个使用Debug.Trace和Hugs.Observe的示例。

    import Debug.Trace
    fact :: Integer -> Integer
    fact 0 = trace "fact 0 ->> 1" 1
    fact n = trace ("fact " ++ show n) (n * fact (n-1))
    
    
    import Hugs.Observe
    fact :: Integer -> Integer
    fact 0 = observe "fact 0" 1
    fact n = observe "fact n" (n *  fact (n-1))
    

    希望这能帮助您了解如何使用WinHungs打印所有缩减。

        3
  •  2
  •   stites James    10 年前

    相信我,你不想走这条路。

    在每种特定情况下使用的缩减集(和顺序)将取决于特定的语言实现(hugs可以用一种方式实现,ghci——换句话说,jhc——用另一种方式实现,等等)。

    推荐文章