2015-05-04 2 views
0
oddSquareSum :: Integer 
oddSquareSum = 
    let oddSquares = filter odd $ map (^2) [1..] 
     belowLimit = takeWhile (<10000) oddSquares 
    in sum belowLimit 
    --extra code to print the list of integers 
    show belowLimit 

Это код для печати суммы квадратов нечетных чисел. Список квадратов нечетных чисел находится в списке, belowLimit и как я могу его распечатать?Как отделить два оператора (или эквивалент точки с запятой)

Добавление в качестве дополнительной строки в конце дает ошибки компиляции, поскольку вызов функции show рассматривается как аргумент функции sum.

+2

Итак, какой результат вы хотите? «Целое» или «Строка»? – Sibi

+1

С одной стороны, вам нужно прочитать о том, как Haskell выбирает представление IO-эффектов в своей системе статического типа. С другой стороны, вы, вероятно, ищете [Debug.Trace.trace] (https://hackage.haskell.org/package/base-4.6.0.1/docs/Debug-Trace.html#v:trace) – Cactus

+0

@ sibi, чтобы напечатать временный список - 'belowLimit', например [1 9 25 ....] и т. д. –

ответ

5

Просто для полноты картины, если вы просто хотите поместить в какой-нибудь временный код для отладки и ни хотите изменить подпись, ни разделить функции, вы также имеете возможность использовать traceShow из Debug.Trace:

import Debug.Trace (traceShow) 

oddSquareSum :: Integer 
oddSquareSum = 
    let oddSquares = filter odd $ map (^2) [1..] 
     belowLimit = takeWhile (<10000) oddSquares 
    in traceShow belowLimit $ sum belowLimit 
7

Вы не можете, а не с тем типом, который у вас есть. Я бы тоже не рекомендовал менять тип в этом случае. Haskell делает различие между типом кода между кодом, который только вычисляет значения и код, который имеет побочные эффекты, такие как печать на экране. Сначала это странная концепция, но она очень полезна для рассуждения о вашем коде, даже на языках, которые его не применяют (я много использую эту стратегию на Python). Вместо этого, написать еще одну функцию, которая будет печатать значение, такие, как

printAnswer :: IO()  -- The IO means that this can have side effects 
printAnswer = print oddSquareSum 

oddSquareSum :: Integer 
oddSquareSum = 
    let oddSquares = filter odd $ map (^2) [1..] 
     belowLimit = takeWhile (<10000) oddSquares 
    in sum belowLimit 

Затем вы можете запустить printAnswer из GHCi после загрузки исходного файла, или вы можете иметь main вызов printAnswer, а затем компилировать файл в исполняемый файл. Если вы собираетесь использовать GHCi, вы можете вообще пропустить эту оболочку и просто введите oddSquareSum прямо в консоль, чтобы увидеть ее значение.

+0

thanks bheklilr ... Я пытаюсь распечатать инструкцию debug, чтобы увидеть значения списка, 'belowLimit'. я могу изменить тип 'oddSquareSum' как' IO() '. –

+1

@MadhavanKumar почему бы не разбить его на отдельную функцию? Я нахожу, что если вы хотите знать промежуточные значения, то это достаточно сложно, чтобы вытащить как самостоятельное вычисление. Напишите функцию, которая вычисляет belowLimit и печатает результат этого. Да, это означает, что в вашем файле будет много маленьких фрагментов кода, но haskell обычно довольно прост для рефакторинга, и сохранение его разлома делает его еще более многоразовым. – bheklilr

Смежные вопросы