小编che*_*ong的帖子

Scala类型推断混淆:任何或没有?

原始版本:

  trait Animal[F[_], A]
  case class Cat[F[_], I, A](limits: F[I], f: I => A) extends Animal[F,A]

  object  ConfuseMe {
    def confuse[F[_], A](tt: Animal[F, A]) = tt match {
      case Cat(_, f) => f
    }
  }
Run Code Online (Sandbox Code Playgroud)

修改版本:

  trait Animal[A]
  case class Cat[I, A](f: I => A) extends Animal[A]

  object  ConfuseMe {
    def confuse[A](tt: Animal[A]) = tt match {
      case Cat(f) => f
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果F是List,原始版本的函数混淆将被推断为Any => A type.修改后的版本将被推断为Nothing => A type作为默认值.为什么不是它们都是IntelliJ IDE所暗示的Nothing => A类型?我完全糊涂了.

其他有趣的例子:

  trait Trampoline[+A]
  case class Done[+A](get: A) …
Run Code Online (Sandbox Code Playgroud)

scala type-inference intellij-idea

5
推荐指数
0
解决办法
124
查看次数

C++构造函数中的混淆

#include <iostream>
using namespace std;

class Obj {
public:
    Obj(){cout <<"create obj" << endl;}
    Obj(const Obj& other){cout<<"copy create obj"<<endl;}
    ~Obj(){cout<<"destructed obj"<<endl;}
};

int main() {
    Obj(Obj((Obj())));
    cout<<"---- exit main ----"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这个程序只打印出1个创建obj和1个被破坏的obj.救命.

c++ oop constructor class object

4
推荐指数
1
解决办法
173
查看次数

Elixir中的元编程

defmodule BBB do
  IO.puts "BBB"
  defmacro hh do
    IO.puts "hh in BBB"
  end
end

defmodule AAA do
  IO.puts "AAA"
  require BBB
  BBB.hh
end
Run Code Online (Sandbox Code Playgroud)

为什么输出:

BBB
hh in BBB
AAA
Run Code Online (Sandbox Code Playgroud)

我对Elixir的编译过程感到困惑.

metaprogramming elixir

1
推荐指数
1
解决办法
55
查看次数