2016-01-20 61 views
3

功能:毫升功能:「一 - >」 B

fn : 'a -> 'b 

現在,在那裏其可以被定義和具有這種類型的任何功能?

+0

你能解釋一下你想做什麼嗎? – Windle

+0

是的,目標是什麼。 –

+0

沒有這樣的函數實際返回任何東西。 (試着構建一個我剛想到的'Heffalump'類型的值。) – molbdnilo

回答

2

我想到一個例子:

fun f a = raise Div; 
+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。

在基礎庫,OS.Process.exit是返回一個未知的泛型類型'a這樣的功能:

- OS.Process.exit; 
val it = fn : OS.Process.status -> 'a 

一個小的反響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 

您也可能會發現有用這question about the type signature of Haskell's forever function

2

我能想到的幾個:

  1. 一說是遞歸的,

    fun f x = f x 
    
  2. 是引發異常的任何功能,

    fun f x = raise SomeExn 
    
  3. 任何功能是相互遞歸,例如,

    fun f x = g x 
    and g x = f x 
    
  4. 使用鑄造的任何功能(需要特定的編譯器的支持,下面是莫斯科ML),

    fun f x = Obj.magic x 
    

    打破這樣的類型系統可能是欺騙,但與其他所有的功能與這種類型這個函數實際上會返回一些東西(最簡單的情況,它的身份功能。)

  5. 拋出,如果在Collat​​z猜想是假的函數,遞歸無限如果屬實,

    fun f x = 
        let fun loop (i : IntInf.int) = 
          if collatz i 
          then loop (i+1) 
          else raise Collatz 
        in loop 1 end 
    

    這是真的只是一個頭兩個的組合。

  6. 任何執行任意I/O並無限遞歸的函數,例如

    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 
    

可能有人會認爲異常和無限遞歸表示相同的理論值⊥(底),意思是「沒有結果」,但因爲你可以捕捉異常,而不是無限遞歸函數,你也可能會爭辯說,他們不一樣。

如果你限制自己功能(例如沒有打印或例外),只有標準ML(而不是編譯器特定的功能),你儘管其在不同的遞歸方案在功能上等同想到的相互遞歸的情況下,我們回到fun f x = f x

爲什麼fun f x = f x具有類型「A→」 B其原因也許是顯而易見的:類型推理算法假定該輸入類型和輸出類型是「一個」 B分別進到結束該函數的唯一約束:即f x的輸入類型必須等於f x的輸入類型,以及f x的輸出類型必須等於f x的輸出類型,在該點處類型「一個'b還沒有專門進一步。