functional-programming - fn : 'a -> ' b 类型的 ml 函数

标签 functional-programming sml ml parametric-polymorphism

功能:

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:

的小型 echo REPL
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/

相关文章:

sml - ML 编程语言 - Curry 函数

java - 将私有(private)方法设为静态以增加函数式编程的习惯

java - 如何使用流将此程序转换为 Java 8 函数式风格?

sml - ML 中 ref 函数的使用

sml - 在 SML 中创建数据类型的测试

module - OCaml 中的嵌套签名示例?

functional-programming - 标准 ML 重复最后一个命令,向左箭头?

Java 8,匿名递归嵌套方法

javascript - 实现教堂数字和后继函数

haskell - SML模块系统和Haskell的Type和Typeclass系统在功能上有什么区别?