Имеется такой код:
fs g = (g fst, g snd)
examples = (fs fmap, fs liftA, fs liftM, fs id, fs ($(1,"2")), fs ((,)id), fs (:[]), fs repeat)
Идея в том, что fs в качестве аргумента принимает полиморфную функцию. Какую type signature надо указать для fs, чтобы это скомпилировалось? Если это вдруг нельзя сделать в Haskell, то есть ли языки со статической типизацией, в которых это возможно?
Здравствуйте, nikov, Вы писали:
N>Имеется такой код:
N>N>fs g = (g fst, g snd)
N>examples = (fs fmap, fs liftA, fs liftM, fs id, fs ($(1,"2")), fs ((,)id), fs (:[]), fs repeat)
N>
N>Идея в том, что fs в качестве аргумента принимает полиморфную функцию. Какую type signature надо указать для fs, чтобы это скомпилировалось? Если это вдруг нельзя сделать в Haskell, то есть ли языки со статической типизацией, в которых это возможно?
Только C++, вестимо.
В Хаскель параметром шаблона (в терминах С++) является тип, но не инстансы типов. Есть какие-то расширения для интегральных параметров, и то, много пузырей по этому поводу. Насчет аналогичных расширений для ф-ых параметров даже пока не заикались.
Здравствуйте, nikov, Вы писали:
N>Идея в том, что fs в качестве аргумента принимает полиморфную функцию. Какую type signature надо указать для fs, чтобы это скомпилировалось?
Так GHCi и сам выводит тип fs:
Prelude> let fs g = (g fst, g snd)
Prelude> :t fs
fs :: (((a, a) -> a) -> t) -> (t, t)
А вот подаются ей на вход неподходящие значения.
Параметр у fs имеет тип (((a, a) -> a) -> t), а, например, repeat имеет тип a -> [a], или у ((,)id) тип a -> (b -> b,a), не говоря уже про id :: a -> a...
Не то подаёте на вход fs...