Ваше ощущение правильное, это невозможно. Частичное применение изменяет тип функции, и каким образом это зависит от того, какой параметр вы применяете. Но если этот параметр индексируется только во время выполнения с дополнительным аргументом, компилятор не знает, какой будет тип, и компилятор должен проверять тип всего. На самом деле вам нужно, чтобы результат имел зависимый тип, но Haskell не является языком с зависимой типизацией.
Теперь, на самом деле, если вы добавите пару расширений GHC и введете пару странных семейств типов, то вы действительно сможете добиться чего-то похожего на такой зависимый тип. Но, честно говоря, я сомневаюсь, что это хорошая идея. Для чего вам это нужно вообще? Если вы жонглируете функциями с более чем, скажем, 8 параметрами, вы, вероятно, делаете что-то не так, и для более простых функций вы можете просто определить 8 комбинаторов, каждый из которых применяет одну фиксированную позицию аргумента.
В качестве альтернативы: аналогичная функция, которая, возможно, разумна, будет
apply_nth :: ([a] -> b) -> Int -> a -> [a] -> b
apply_nth f i a xs = f $ before ++ [a] ++ after
where (before, after) = splitAt i xs
В отличие от списков аргументов, список значений может легко состоять из сотен элементов, поэтому в этом случае может иметь смысл предварительное применение отдельных элементов, проиндексированных во время выполнения.
Это не просто мера предосторожности — это необходимо, поскольку типы даже не существуют во время выполнения, поэтому компилятору необходимо завершить подготовку всех условий, которые могут зависеть от типов. Вот почему Haskell безопасен, и краток, и быстр, и расширяем, как некоторые другие языки.
person
leftaroundabout
schedule
22.10.2015