#haskell #module
#haskell #модуль
Вопрос:
Вот модуль — Number1.hs
module Number1(isTriangle) where
isTriangle x y z = if x*x y*y >= z*z then True
else False
Это основная программа Main1.hs
import System.Environment
import Number1
main = do
args<-getArgs
let a = args !! 0
let b = args !! 1
let c = args !! 2
if (IsTriangle a b c) then return(True)
else return(False)
Эту ошибку я получаю, когда ghc --make Main1.hs
Комментарии:
1. p.s.
if something then True else False
это то же самое, что иsomething
Ответ №1:
Когда вы вызываете isTriangle
Main1.hs, вы вызываете его с большой буквы «I».
Убедитесь, что ваша заглавная буква совпадает, поскольку Haskell чувствителен к регистру, и убедитесь, что функции начинаются со строчного символа, поскольку это обязательно.
Редактировать — округление других ошибок
Main1.hs:
import System.Environment
import Number1
main :: IO()
main = do
args<-getArgs
{- Ideally you should check that there are at least 3 arguments
before trying to read them, but that wasn't part of your
question. -}
let a = read (args !! 0) -- read converts [Char] to a number
let b = read (args !! 1)
let c = read (args !! 2)
if (isTriangle a b c) then putStrLn "True"
else putStrLn "False"
Number1.hs:
module Number1(isTriangle) where
{- It's always best to specify the type of a function so that both you and
the compiler understand what you're trying to achieve. It'll help you
no end. -}
isTriangle :: Int -> Int -> Int -> Bool
isTriangle x y z = if x*x y*y >= z*z then True
else False
Комментарии:
1. Переменные, которые вы передаете, не являются числами, они представляют собой списки символов. Я вставлю правильный код в свой первоначальный ответ.
2. Спасибо. Но он ничего не возвращает. Для примера
>Main1 3 4 5
— и никакого результата3. Да, это потому, что ваша
main
функция не ожидает аргументов. Поскольку вы не указали тип функции, компилятор решает, что он должен иметь типIO Bool
, поскольку он возвращает логическое значение. Чтобы он получал аргументы, вы должны присвоить ему типIO()
, что означает, что вы не можете возвращать значение так же, как у вас есть. Я обновлю код, чтобы вместо него выводились «True» и «False».4. Я лично просто использовал бы
print $ isTriangle x y z
5. @DanBurton Да, это лучший способ сделать это.