Отладка Haskell
Как я могу распечатать список или что-то в Haskell при каждом звонке например :
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
2 ответов
для отладки, есть
import Debug.Trace
funct :: Integer -> [Integer] -> Bool
funct a list = trace (show list) $ funct (a + 1) (a : list)
здесь trace :: String -> a -> a
. Он использует unsafePerformIO
под капотом, так что это зло и только для отладки.
имейте в виду, что из-за ленивой оценки выход отладки может появиться в удивительном порядке и чередоваться с выходом, который обычно генерирует программа.
С
module TraceIt where
import Debug.Trace
funct :: Integer -> [Integer] -> Bool
funct 10 list = null list
funct a list = trace (show list) $ funct (a + 1) (a : list)
Я
*TraceIt> funct 1 []
[]
[1]
[2,1]
[3,2,1]
[4,3,2,1]
[5,4,3,2,1]
[6,5,4,3,2,1]
[7,6,5,4,3,2,1]
[8,7,6,5,4,3,2,1]
False
как и ожидалось.
то же самое, что предложил Дэниел Фишер, но с unsafePerformIO
только.
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
посмотри аналогичный вопрос описывает, что на самом деле происходит, когда вы используете unsafePerformIO
.