Dor*_*ick 3 functional-programming ml sml parametric-polymorphism
功能:
fn : 'a -> 'b
Run Code Online (Sandbox Code Playgroud)
现在,是否有任何可以定义并具有此类型的功能?
标准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;
Run Code Online (Sandbox Code Playgroud)
第一个解决方案可能对定义辅助函数很有用,比如bug,它可以节省一些关键笔划:
fun bug msg = raise Fail ("BUG: " ^ msg);
Run Code Online (Sandbox Code Playgroud)
另一个解决方案可能对定义服务器循环或REPL很有用.
在Basis库中,OS.Process.exit是一个返回未知泛型类型的函数'a:
- OS.Process.exit;
val it = fn : OS.Process.status -> 'a
Run Code Online (Sandbox Code Playgroud)
一个小型回声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
Run Code Online (Sandbox Code Playgroud)
您可能还会发现有关Haskell forever函数类型签名的有用问题.