Как проверить мои функции haskell - PullRequest
4 голосов
/ 13 октября 2011

Я только начал с Haskell и попытался сначала написать несколько тестов. По сути, я хочу определить некоторую функцию, а затем вызвать эту функцию, чтобы проверить поведение.

add :: Integer -> Integer -> Integer
add a b = a+b

-- Test my function 
add 2 3

Если я загружаю этот маленький скрипт в Hugs98, я получаю следующую ошибку:

Syntax error in declaration (unexpected `}', possibly due to bad layout)

Если я удаляю последнюю строку, загружаю скрипт, а затем набираю «добавить 2 3» в интерпретаторе объятий, он работает просто отлично.

Итак, вопрос: как я могу поместить вызовы своих функций в тот же скрипт, что и определение функции? Я просто хочу загрузить скрипт и быть в состоянии проверить, выполняет ли он то, что я от него ожидаю ... Я не хочу постоянно вводить их вручную.

Ответы [ 5 ]

12 голосов
/ 13 октября 2011

Другие говорили, как решить вашу непосредственную проблему, но для тестирования вы должны использовать QuickCheck или некоторую другую автоматизированную библиотеку тестирования .

import Test.QuickCheck
prop_5 = add 2 3 == 5
prop_leftIdentity n = add 0 n == n

Затем запустите quickCheck prop_5 и quickCheck prop_leftIdentity в сеансе Hugs. QuickCheck может сделать намного больше, чем это, но это поможет вам начать.

(Вот учебник QuickCheck , но он устарел. Кто-нибудь знает, что такое QuickCheck 2?)

7 голосов
/ 13 октября 2011

самый удобный способ для новичков - это, вероятно, модуль doctest . Загрузите его с помощью «cabal install doctest», затем поместите ваш код в файл «Add.hs» и запустите «doctest Add.hs» из командной строки.

Ваш код должен выглядеть следующим образом, важно форматирование:

module Add where

-- | add adds two numbers
--
-- >>> add 2 3
-- 5
-- >>> add 5 0
-- 5
-- >>> add 0 0
-- 0
add :: Integer -> Integer -> Integer
add a b = a+b

HTH Крис

3 голосов
/ 13 октября 2011

Сделайте определение верхнего уровня:

add :: Integer -> Integer -> Integer
add a b = a + b

test1 = add 2 3

Затем вызовите test1 в сеансе Hugs.

2 голосов
/ 13 октября 2011

Как я могу поместить вызовы своих функций в тот же скрипт, что и определение функции?Я просто хочу загрузить скрипт и быть в состоянии проверить, выполняет ли он то, что я ожидаю ... Я не хочу вводить их вручную все время.

Короче говоря, выне может.Оберните его в функцию и вызовите его.Ваш файл служит допустимым модулем Haskell, и использование выражения «летать» не является правильным способом его записи.

Вы, похоже, пришли из языка сценариев, но не пытайтесь рассматривать Haskell каким.

0 голосов
/ 14 октября 2011

Если у вас установлен ghc, то команда runhaskell интерпретирует и запустит функцию main в вашем файле.

add x y = x + y
main = print $ add 2 3

Затем в командной строке

> runhaskell Add.hs
5

Не уверен, но объятия, вероятно, похожи на команду runhaskell. Или, если вы загрузите файл в интерпретатор объятий, вы можете просто запустить его, вызвав main.

...