Вопрос про rank-N polymorphism
От: nikov США http://www.linkedin.com/in/nikov
Дата: 06.06.09 22:01
Оценка:
Имеется такой код:
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, то есть ли языки со статической типизацией, в которых это возможно?
Re: Вопрос про rank-N polymorphism
От: vdimas Россия  
Дата: 07.06.09 19:48
Оценка:
Здравствуйте, 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++, вестимо.

В Хаскель параметром шаблона (в терминах С++) является тип, но не инстансы типов. Есть какие-то расширения для интегральных параметров, и то, много пузырей по этому поводу. Насчет аналогичных расширений для ф-ых параметров даже пока не заикались.
Re: Вопрос про rank-N polymorphism
От: geniepro http://geniepro.livejournal.com/
Дата: 08.06.09 05:03
Оценка:
Здравствуйте, 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...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.