Можно ли использовать охранники в определении функций в idris?

В хаскеле можно написать:

containsTen::Num a => Eq a => [a] -> Bool
containsTen (x : y : xs)
    | x + y == 10 = True
    | otherwise = False

Можно ли написать что-то эквивалентное в Идрисе, не делая это с ifThenElse (мой реальный случай более сложный, чем приведенный выше)?

1 ответ

Решение

У Идриса нет паттернов, как в Хаскеле. Есть предложение with, которое синтаксически похоже (но более мощное, поскольку поддерживает сопоставление при наличии зависимых типов):

containsTen : Num a => List a -> Bool
containsTen (x :: y :: xs) with (x + y)
    | 10 = True
    | _  = False

Вы можете взглянуть на раздел 7 Представлений учебника Idris и правило "с".

Другие вопросы по тегам