作者 godfat (godfat 真常) 看板 PLT
標題 Re: [問題] 程式語言大部分是 Turing Complete 的嗎?
時間 Thu Jun 25 23:18:20 2009
───────────────────────────────────────
一般而言是把 void 當成 bottom, 不過當然性質上應該是差滿多的...
至少這件事是沒辦法做的:
1 void undef(){}
2 int i = undef();
而就像 Haskell 可以:
1 undef = undef
2 f :: Int
3 f = undef
剛剛試 Scala 也可以:
1 def undef: Nothing = undef
2 val i = undef
另外我總算找到當初在講 C++ None 的討論:
Subject: [Proposal] noreturn_t
如果以 Andrei Alexandrescu 所定義 None 的話:
1 struct None{
2 None(){ throw "can't happen"; }
3 None(const None&){}
4 template <class T>
5 operator T&() const{
6 throw "can't happen";
7 return *this;
8 }
9 };
那倒是真的可以這樣做了:
1 None undef(){}
2 int i = undef();
這樣程式會立即有 exception, 而不是卡住。不過改成 while(true); 也行..
(Haskell 的 undefined 大概就類似這邊的 None 吧?)
不過我不是很懂這件事跟 bottom 有 term 有什麼關係..?
像 None 這樣算是 bottom 有 term 嗎?
*
以下可能有點離題了,順便把上面那篇討論的一些事提一提:
製作 None 的理由,包含主旨的 noreturn_t, 大概是想表達程式不可能
可以執行到那個地方,比方說某個 function 一定需要造成程式中斷:
1 void graceful_exit(){
2 exit(0);
3 }
但如果 exit(0); 什麼事都沒發生咧?如果改成:
1 None graceful_exit(){
2 exit(0);
3 }
這樣如果 exit(0); 什麼事都沒發生,None 就會產生,而 None 產生就如同上面
所定義,會產生 exception, 於是整個程式就爛掉了,而不是「什麼事都沒發生」
另一方面則是關於 ternary operator, 像是:
1 int i = condition ? something() : undef();
或是更激進的:
1 int i = something() || undef();
這樣很多事情就可以由 statement 改寫成 expression 了。
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.