功能:
fn : 'a -> 'b
现在,有没有可以定义并具有这种类型的函数?
最佳答案
标准 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 有用。
在Basis库中,OS.Process.exit
就是这样一个返回未知泛型类型'a
的函数:
- OS.Process.exit;
val it = fn : OS.Process.status -> 'a
一个类型为 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 有用.
关于functional-programming - fn : 'a -> ' b 类型的 ml 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34912121/