Не в области видимости: конструктор данных IsTriangle

#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 Да, это лучший способ сделать это.