Haskell - переменная не в области ошибки - новичок - PullRequest
4 голосов
/ 14 октября 2019

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

Вот мой код, который я загружаю в GHCi, используя :load

validLength :: String -> Bool
validLength xs | length xs == 26 = True
               | otherwise = False

Затем я набираю validLength aa, который должен вернуть false, но яполучаю ошибку.

*Main> validLength aa

<interactive>:1:13: error: Variable not in scope: aa :: String

Ответы [ 2 ]

4 голосов
/ 14 октября 2019

Идентификаторы не являются строками. (Это ни в коем случае не является особенным для Haskell, то же самое в большинстве других языков.) Поэтому, когда вы задаете aa в качестве аргумента, GHC интерпретирует его как имя некоторой переменной . Но, ну, нет никакой переменной с этим именем, по крайней мере, не в области видимости, поэтому ошибка.

Если вы хотите передать строку, состоящую из двух a символов ,тогда вы должны использовать строку литерал . Строковый литерал - это просто строка в двойных кавычках (опять-таки, так же, как и во многих других языках программирования).

*Main> validLength "aa"
False
2 голосов
/ 14 октября 2019

Просто для того, чтобы добавить кое-что в свой код, не бойтесь возвращать выражение или функцию, которая возвращает логическое значение:

:t (==)
(==) :: Eq a => a -> a -> Bool

,

3==4 -> False
length [1,2,3] == 26 -> False

Таким образом, ваш код может быть просто:

validLength :: String -> Bool
validLength xs = length xs == 26 

или:

validLength :: String -> Bool
validLength =  (== 26) .  length 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...