簡體   English   中英

“不在范圍內:'跟蹤”是什么意思,我該如何解決?

[英]What does it mean “Not in scope: ‘trace” and how can i resolve this?

我正在嘗試運行程序,但是我總是在終端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 dn地方都添加traceIt dn (這是很討厭的),您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM