Не можете создать функцию применения со статическим языком? - PullRequest
21 голосов
/ 12 сентября 2010

Я читал, что в статически типизированном языке, таком как Scala или Haskell, нет способа создать или предоставить функцию Lisp apply:

(apply #'+ (list 1 2 3)) => 6

или, может быть,

(apply #'list '(list :foo 1 2 "bar")) => (:FOO 1 2 "bar")
(apply #'nth (list 1 '(1 2 3))) => 2

Это правда?

Ответы [ 12 ]

0 голосов
/ 15 сентября 2010

Для Haskell, чтобы сделать это динамически, см. Data.Dynamic и dynApp, в частности: http://www.haskell.org/ghc/docs/6.12.1/html/libraries/base/Data-Dynamic.html

0 голосов
/ 12 сентября 2010

Список в Haskell может хранить значения только одного типа, поэтому вы не можете делать забавные вещи, такие как (apply substring ["Foo",2,3]).Haskell также не имеет функций с переменным числом, поэтому (+) может принимать только два аргумента.

В Haskell есть функция $:

($)                     :: (a -> b) -> a -> b
f $ x                   =  f x

Но это действительно очень полезно, посколькунизкий приоритет, или как проходящий через HOF.

Я полагаю, вы могли бы сделать что-то подобное, используя типы кортежей и fundeps, хотя?

class Apply f tt vt | f -> tt, f -> vt where
  apply :: f -> tt -> vt

instance Apply (a -> r) a r where
  apply f t = f t

instance Apply (a1 -> a2 -> r) (a1,a2) r where
  apply f (t1,t2) = f t1 t2

instance Apply (a1 -> a2 -> a3 -> r) (a1,a2,a3) r where
  apply f (t1,t2,t3) = f t1 t2 t3

Я думаю, что это своего рода', не так ли?

Редактировать : это на самом деле не компилируется;заменено ответом @ FUZxxl.

...