fn的ml函数:' a - > &#39,B

时间:2016-01-20 22:47:32

标签: functional-programming sml ml parametric-polymorphism

功能:

element.style.property

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

3 个答案:

答案 0 :(得分: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;

第一个解决方案可能对定义辅助函数很有用,比如说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的小型回声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

答案 1 :(得分:2)

我可以想到一个例子:

fun f a = raise Div;

答案 2 :(得分:2)

我能想到几个:

  1. 一个递归的,

    <fieldset class="variations_fieldset">
        <input type="radio" data-attribute_name="attribute_billing" name="attribute_billing" id="billing1" value="Once Off">
        <label for="billing1">Once Off</label>
        <input type="radio" data-attribute_name="attribute_billing" name="attribute_billing" id="billing2" value="Every 1 month">
        <label for="billing2">Every 1 month</label>
        <input type="radio" data-attribute_name="attribute_billing" name="attribute_billing" id="billing3" value="Every 2 months" checked="checked">
        <label for="billing3">Every 2 months</label>
    </fieldset>
    
  2. 任何引发异常的函数,

    fun f x = f x
    
  3. 任何相互递归的函数,例如

    fun f x = raise SomeExn
    
  4. 任何使用强制转换的函数(需要特定的编译器支持,下面是莫斯科ML),

    fun f x = g x
    and g x = f x
    

    像这样破坏类型系统可能是作弊,但与此类型的所有其他函数不同,此函数实际上返回了一些东西。 (在最简单的情况下,它是身份功能。)

  5. 如果Collat​​z猜想为false则抛出的函数,如果为true则无限递归,

    fun f x = Obj.magic x
    

    这实际上只是前两者的组合。

  6. 任何执行任意I / O并无限递归的函数,例如

    fun f x =
        let fun loop (i : IntInf.int) =
                if collatz i
                then loop (i+1)
                else raise Collatz
        in loop 1 end
    
  7. 有人可能会争辩说,异常和无限递归代表相同的理论价值⊥(底部)含义&#34;没有结果&#34;,虽然因为你可以捕捉异常而不是无限递归函数,你也可以认为它们是&#39 ;不同。

    如果您将自己局限于函数(例如,没有打印或例外)并且仅限于标准ML(而不是编译器特定的功能),并且您认为相互递归的情况在功能上等同于尽管他们不同的递归方案,我们回到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

    fun f x = f x类型&#39; a→&#39; b 的原因可能很明显:类型推理算法假设输入类型和输出类型是&#39; a &#39; b 分别继续完成函数的唯一约束:fun f x = f x&#39;输入类型必须等于f x的输入类型,并且f x的输出类型必须等于f x的输出类型此时,&#39; &#39; b 类型尚未进一步专业化。