Cannot create apply function with static language?

前端 未结 12 1072
梦谈多话
梦谈多话 2021-02-04 02:09

I have read that with a statically typed language like Scala or Haskell there is no way to create or provide a Lisp apply function:

(apply #\'+ (lis         


        
12条回答
  •  眼角桃花
    2021-02-04 02:48

    It's trivial in Scala:

    Welcome to Scala version 2.8.0.final ...
    
    scala> val li1 = List(1, 2, 3)
    li1: List[Int] = List(1, 2, 3)
    
    scala> li1.reduceLeft(_ + _)
    res1: Int = 6
    

    OK, typeless:

    scala> def m1(args: Any*): Any = args.length
    m1: (args: Any*)Any
    
    scala> val f1 = m1 _
    f1: (Any*) => Any = 
    
    scala> def apply(f: (Any*) => Any, args: Any*) = f(args: _*)
    apply: (f: (Any*) => Any,args: Any*)Any
    
    scala> apply(f1, "we", "don't", "need", "no", "stinkin'", "types")
    res0: Any = 6
    

    Perhaps I mixed up funcall and apply, so:

    scala> def funcall(f: (Any*) => Any, args: Any*) = f(args: _*)
    funcall: (f: (Any*) => Any,args: Any*)Any
    
    scala> def apply(f: (Any*) => Any, args: List[Any]) = f(args: _*)
    apply: (f: (Any*) => Any,args: List[Any])Any
    
    scala> apply(f1, List("we", "don't", "need", "no", "stinkin'", "types"))
    res0: Any = 6
    
    scala> funcall(f1, "we", "don't", "need", "no", "stinkin'", "types")
    res1: Any = 6
    

提交回复
热议问题