我正在尝试运行程序,但是我总是在终端fib3.hs:3:12中得到它:不在范围内:'trace',我不知道这是什么意思,或者我该如何解决。我是Ver的初学者,并且Haskell ...我的代码
-- fib3.hs
fib :: Integer -> Integer -> Integer
fib d n | trace (shift d ++ "Call: fib " ++ show n)
False = 0
fib _ 0 = 0
fib _ 1 = 1
fib d n = fib (d+1) (n-1)
+ fib (d+1) (n-2)
shift :: Integer -> String
shift 0 = ""
shift n = " " ++ shift (n-1)
错误告诉您Haskell无法找到该函数trace
-问题是,它不在序言中,而是在Debug.Trace
模块中,因此您必须导入它。
最简单的方法是添加
import Debug.Trace
低于您的module
定义(如果有的话-如果不仅在文件的顶部,还吹了一些{-# LANGUAGE ... #-}
杂物(如果有的话))
这将导入的一切,从Debug.Trace
我个人不喜欢(这是很难找出一个函数这样定义) -这就是为什么我通常喜欢只导入所需的功能和定义(所以我可以告诉他们是从哪里来的) 像这样:
import Debug.Trace (trace)
因此,解决您的问题的方法可能如下所示:
module MyFibModule where
import Debug.Trace (trace)
-- fib3.hs
fib :: Integer -> Integer -> Integer
fib d n | trace (shift d ++ "Call: fib " ++ show n)
False = 0
fib _ 0 = 0
fib _ 1 = 1
fib d n = fib (d+1) (n-1)
+ fib (d+1) (n-2)
shift :: Integer -> String
shift 0 = ""
shift n = " " ++ shift (n-1)
...
瞧:
λ> fib 1 4
Call: fib 4
Call: fib 2
Call: fib 0
Call: fib 1
Call: fib 3
Call: fib 1
Call: fib 2
Call: fib 0
Call: fib 1
3
其余的不在主题范围内,但您可能会感兴趣:
我将其重写为:
fib :: Integer -> Integer -> Integer
fib d 0 = traceIt d 0 $ 0
fib d 1 = traceIt d 1 $ 1
fib d n = traceIt d n $ fib (d+1) (n-1) + fib (d+1) (n-2)
traceIt :: Integer -> Integer -> a -> a
traceIt d n = trace (shift d ++ "Call: fib " ++ show n)
shift :: Integer -> String
shift 0 = ""
shift n = " " ++ shift (n-1)
在后卫-招似乎有太多的神奇IMO(我明明完全错过在第一:(点...所以你决定:我是愚蠢的或者是代码晦涩难懂的阅读?)
如果您不喜欢这样,则必须在所有位置加上前缀traceIt d n
(很讨厌),您可以使用来修复递归trace
:
fib :: Integer -> Integer
fib = fib' 0
fib' :: Integer -> Integer -> Integer
fib' d n = traceIt d n $ fibF (fib' (d+1)) n
fibF :: (Integer -> Integer) -> Integer -> Integer
fibF _ 0 = 0
fibF _ 1 = 1
fibF f n = f (n-1) + f (n-2)
traceIt :: Integer -> Integer -> a -> a
traceIt d n = trace (shift d ++ "Call: fib " ++ show n)
λ> fib 4
Call: fib 4
Call: fib 2
Call: fib 0
Call: fib 1
Call: fib 3
Call: fib 1
Call: fib 2
Call: fib 0
Call: fib 1
3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句