Как вернуть другой тип в функцию рекурсии?(Haskell) - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно вернуть, например, целое число или логическое значение в рекурсивной функции.

Пример кода моей проблемы:

findInt :: [Int] -> Either Int Bool
findInt (x:xs) =
     if x == 1 then x
     else False : findInt xs

Тогда ошибка говорит: cannне соответствует ожидаемому типу "Either Int Bool" с фактическим типом "Int" .Но я хочу проверить, есть ли элемент в этом списке, и если он это сделает, он вернет элемент и скажет мне, если нет, вернув логическое значение.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Ваша функция не имеет типа: x :: Int и (False : _) :: [Bool], и эти два типа не могут быть объединены (читается :: как "имеет тип").

Tweaked,

findInt (x:xs) =
     if x == 1 then Left x
     else Right False : findInt xs

он по-прежнему не имеет типа: Left x :: Either Int b и (Right False : _) :: [Either a Bool], и эти два типа также не могут быть объединены.

Но

findInt :: [Int] -> Either Int Bool
findInt (x:xs) =
     if x == 1 then Left x
     else findInt xs
findInt [] = Right False

имееттип, потому что Left x :: Either Int b и Right False :: Either a Bool, и эти два типа могут быть унифицированными:

        Either Int b
        Either a   Bool
       -----------------      a ~ Int , b ~ Bool
        Either Int Bool

Унифицированный тип действительно Either Int Bool, как указывает сигнатура типа.

0 голосов
/ 15 октября 2018

Поскольку вы никогда не используете True в своем выводе, использование Either Int Bool изоморфно Maybe Int:

a2b :: Either Int Bool -> Maybe Int
a2b (Right x) = Just x
a2b (Left x) = Nothing

b2a :: Maybe Int -> Either Int Bool
b2a (Just x) -> Right x
b2a Nothing -> Left False

Поэтому я бы просто использовал Maybe Int для упрощения вашей функции.

findInt :: [Int] -> Maybe Int
findInt [] = Nothing
findInt (x:xs) = if x == 1 then Just x else findInt xs
0 голосов
/ 15 октября 2018

Если вы посмотрите на тип Either , вы увидите, что он имеет два конструктора, Left и Right.Чтобы создать значение типа Either, вам нужно использовать один из конструкторов.например,

if x == 1 then Left x

В частности, Left используется для создания первого типа любого типа (в данном случае Int), а Right используется для второго типа (Bool вэто дело).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...