原始版本:
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) #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.救命.
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的编译过程感到困惑.