fn的ml函数:'a - >'b

Dor*_*ick 3 functional-programming ml sml parametric-polymorphism

功能:

fn : 'a -> 'b
Run Code Online (Sandbox Code Playgroud)

现在,是否有任何可以定义并具有此类型的功能?

Ion*_*tan 5

标准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函数类型签名的有用问题.