Я думаю, что это вопрос о неспешности.Стандартная библиотека предоставляет функции для быстрого вывода продуктов, см. uncurry .В вашей ситуации было бы более полезно иметь функцию uncurry, в которой первый аргумент скрыт, поскольку функция head обычно принимает индекс длины в качестве неявного аргумента.Мы можем написать функцию uncurry следующим образом:
uncurryʰ : ∀ {a b c} {A : Set a} {B : A → Set b} {C : (a : A) → B a → Set c} →
({x : A} → (y : B x) → C x y) →
((p : Σ A B) → uncurry C p)
uncurryʰ f (x , y) = f {x} y
Функция, которая возвращает заголовок вектора, если он есть, кажется, не существует в стандартной библиотеке, поэтому мы пишем один:
maybe-head : ∀ {a n} {A : Set a} → Vec A n → Maybe A
maybe-head [] = nothing
maybe-head (x ∷ xs) = just x
Теперь желаемая функция - это просто вопрос выполнения функции Maybe-Head с помощью функции first-arguments-implicit-uncurry, определенной выше:
maybe-filter-head : ∀ {A : Set} {n} → (A → Bool) → Vec A n → Maybe A
maybe-filter-head p = uncurryʰ maybe-head ∘ filter p
Вывод: зависимые продукты с удовольствием каррируют и не работаюткак и их независимые версии.
Не обращая внимания, функция, которую вы хотите написать с сигнатурой типа
head : ∀ {A} → ∃ (λ n → Vec A n) → IsTrue (n ≥ succ zero) → A
Может быть записана как:
head : ∀ {A} → (p : ∃ (λ n → Vec A n)) → IsTrue (proj₁ p ≥ succ zero) → A