2009-05-16 3 views
0

Im new to Haskell !! Я написал этот код:синтаксис в выражении - Haskell

import Data.List 
inputIndex :: [String] -> [String] -> Bool 
inputIndex listx input = and [x `elem` listx |x <- input] 
inputIndex = if inputIndex == true 
       then putStrLn ("ok") 

Это прекрасно работает без if заявления, но когда я ставлю if заявление следующее сообщение об ошибке показано ниже:

Синтаксическая ошибка в выражении (неожиданный `}», возможно, из-за плохой компоновки)

Что я здесь делаю неправильно?

Благодаря

+2

Где находится "этот код", о котором вы писали? – ShreevatsaR

+0

Вам нужно будет отформатировать этот код немного лучше, чтобы мы могли его правильно прочитать. –

ответ

8

Несколько вещей, которые здесь не так:

  • Вы будете потребность клаузула еще.
  • True должен быть капитализирован.
  • inputIndex должен всегда принимать два аргумента (сейчас это не так, в последнем случае).

Я думаю, вы хотите что-то вроде этого ...

inputIndex :: [String] -> [String] -> IO() 
inputIndex listx input = if inputIndex' listx input 
          then putStrLn ("ok") 
          else putStrLn ("not ok") 
    where 
    inputIndex' :: [String] -> [String] -> Bool 
    inputIndex' listx input = and [x `elem` listx |x <- input] 

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

Вы также можете конденсировать это к следующему (что также более общее):

allPresent :: (Eq t) => [t] -> [t] -> IO() 
allPresent xs ys = putStrLn (if and [y `elem` xs | y <- ys] then "ok" else "not ok") 
+0

спасибо! он работал по назначению. не могли бы вы рассказать мне смысл запятой перед inputIndex. – pier

+0

он работал даже без первой строки inputIndex :: [String] -> [String] -> IO() – pier

+0

@dlna: запятая - это апостроф. Я обновил свой ответ с некоторым объяснением. Первая строка действительно не нужна. Без него функция работает для каждой пары списков одного типа (потому что Haskell затем раскрывает наиболее общий тип.) – Stephan202

0
  1. Это "True", а не "истина".
  2. Ваша вторая реализация inputIndex несовместима с первой. Все ваши шаблоны для функции должны иметь одну и ту же подпись ([String] -> [String] -> Bool)
  3. Ошибка, которую вы видите здесь, не генерируется этим кодом, так как здесь нет '}'.
  4. putStrLn имеет подпись String -> IO(), в то время как ваш inputIndex выглядит так, будто он должен быть чистым - просто верните значение и распечатайте его в другом месте.
Смежные вопросы