回答
我想到一個例子:
fun f a = raise Div;
是的,這就是我的意思。任何其他想法? –
有在標準ML是函數簽名兩種可能的實現。其中採用的例外,其他的遞歸:
val raises : 'a -> 'b =
fn a => raise Fail "some error";
(* Infinite looping; satisfies the type signature, *)
(* but won't ever produce anything. *)
val rec loops : 'a -> 'b =
fn a => loops a;
第一種解決方案可能是用於定義一個輔助功能是有用的,說bug
,既節約了幾個關鍵招:
fun bug msg = raise Fail ("BUG: "^msg);
另一種解決方案可能是有用的用於定義服務器環路或REPL。
在基礎庫,OS.Process.exit
是返回一個未知的泛型類型'a
這樣的功能:
- OS.Process.exit;
val it = fn : OS.Process.status -> 'a
一個小的反響REPL與val repl = fn : unit -> 'a
類型:
fun repl() =
let
val line = TextIO.inputLine TextIO.stdIn
in
case line of
NONE => OS.Process.exit OS.Process.failure
| SOME ":q\n" => OS.Process.exit OS.Process.success
| SOME line => (TextIO.print line ; repl())
end
您也可能會發現有用這question about the type signature of Haskell's forever
function。
我能想到的幾個:
一說是遞歸的,
fun f x = f x
是引發異常的任何功能,
fun f x = raise SomeExn
任何功能是相互遞歸,例如,
fun f x = g x and g x = f x
使用鑄造的任何功能(需要特定的編譯器的支持,下面是莫斯科ML),
fun f x = Obj.magic x
打破這樣的類型系統可能是欺騙,但與其他所有的功能與這種類型這個函數實際上會返回一些東西(最簡單的情況,它的身份功能。)
拋出,如果在Collatz猜想是假的函數,遞歸無限如果屬實,
fun f x = let fun loop (i : IntInf.int) = if collatz i then loop (i+1) else raise Collatz in loop 1 end
這是真的只是一個頭兩個的組合。
任何執行任意I/O並無限遞歸的函數,例如
fun f x = (print "Woohoo!"; f x) fun repl x = let val y = read() val z = eval y val _ = print z in repl x end
可能有人會認爲異常和無限遞歸表示相同的理論值⊥(底),意思是「沒有結果」,但因爲你可以捕捉異常,而不是無限遞歸函數,你也可能會爭辯說,他們不一樣。
如果你限制自己純功能(例如沒有打印或例外),只有標準ML(而不是編譯器特定的功能),你儘管其在不同的遞歸方案在功能上等同想到的相互遞歸的情況下,我們回到fun f x = f x
。
爲什麼fun f x = f x
具有類型「A→」 B其原因也許是顯而易見的:類型推理算法假定該輸入類型和輸出類型是「一個和」 B分別進到結束該函數的唯一約束:即f x
的輸入類型必須等於f x
的輸入類型,以及f x
的輸出類型必須等於f x
的輸出類型,在該點處類型「一個和'b還沒有專門進一步。
- 1. Java8功能類型`(A,B) - >一個+ B`
- 2. 在PHP有些疑惑包括()<b>功能</b>
- 3. 重量分類(克,毫升,升,毫升)
- 4. 自定義地圖功能標準毫升
- 5. 如何鏈 - > IO(M B)功能
- 6. 實施例功能 - 功能::貨號B =>乙 - >甲 - >並[a]
- 7. 功能型的( 'A - >' B)列表 - > 'A - >' b在OCaml的列表
- 8. 標準毫升的數據類型功能
- 9. 上的`一個類型的約束 - > B`功能
- 10. 是否有任何使用情況下此功能:FOO ::(B - > C) - >(A - > B) - >(A - > C)
- 11. 偏差X - > {一} {B}和$ X - > {一} - > {B}
- 12. 榆樹升降功能
- 13. 功能(A)後,JQuery 2功能不能激活功能(B)
- 14. 轉型(一 - > IO b)至10(一 - > B)
- 15. <b>致命錯誤</b>:不能使用[]讀取
- 16. 我想能夠得到所有的`<b></b>
- 17. 活動B總功能
- 18. 提升中下劃線的含義[A,B](f:A => B):選項[A] =>選項[B] = _ map f
- 19. 改變毫升到公升if語句
- 20. 如何以毫秒爲單位計時而不用提升功能::定時器
- 21. 特質擴展(A => B)是一種特質擴展功能嗎?
- 22. 了JavaFx毫升的Eclipse
- 23. 毫米升壓::單位
- 24. Scala - >功能
- 25. 用於打印毫秒的CAPL功能?
- 26. 涉及的功能組合物(\ A B - > F(克)(克b))的一個常見的模式
- 27. 是在<b></b>
- 28. 活動VS升壓::功能
- 29. 提升功能問題
- 30. 存儲提升功能
你能解釋一下你想做什麼嗎? – Windle
是的,目標是什麼。 –
沒有這樣的函數實際返回任何東西。 (試着構建一個我剛想到的'Heffalump'類型的值。) – molbdnilo