What have you found for these years?

2009-06-26

void, none, bottom

 作者  godfat (godfat 真常)                                         看板  PLT
標題 Re: [問題] 程式語言大部分是 Turing Complete 的嗎?
時間 Thu Jun 25 23:18:20 2009
───────────────────────────────────────

一般而言是把 void 當成 bottom, 不過當然性質上應該是差滿多的...
至少這件事是沒辦法做的:
   1  void undef(){}
2 int i = undef(); // type error

而就像 Haskell 可以:
   1  undef = undef
2 f :: Int
3 f = undef

剛剛試 Scala 也可以:
   1  def undef: Nothing = undef // 需要明白表示 Nothing (bottom)
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{ // 這是自動型別轉換,這樣寫就是能轉成任何 type
6 throw "can't happen";
7 return *this;
8 }
9 };

那倒是真的可以這樣做了:
   1  None undef(){}
2 int i = undef(); // type error

這樣程式會立即有 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

All texts are licensed under CC Attribution 3.0