2010-12-21 45 views
8

我需要幫助理解來自Thrist包的這個類型簽名。瞭解複雜類型簽名

import Prelude hiding ((.), id) 
import Control.Category 
import Data.Monoid 
import Control.Arrow 
import Control.Monad 

foldlThirst :: (forall j k . (a +> j) -> (j ~> k) -> (a +> k)) 
       -> (a +> b) 
       -> Thrist (~>) b c 
       -> (a +> c) 

我對幾件事感到困惑。

首先是什麼是+>和〜>符號?他們在哪裏記錄,他們叫什麼?

但我的困惑確實停在那裏。我意識到量化描述了Thrist類型的線程,但我不確定是否描述了一個關係適用於第一個參數,或者整個函數,或者誰知道......

在其他情況下,我已經看到存在的量化,這句話以一個句點結束,但在這裏以 - >結尾,這是否意義重大?

回答

8

首先是什麼是+>和〜>符號?他們在哪裏記錄,他們叫什麼?

它們是中綴標識符,就像將它們用作函數的名稱一樣。同理,相當於小寫字母標識符(與:開頭的操作符相當於大寫字母數字標識符),在類型簽名中,它們只是類型變量。換句話說,它是等價於:

(forall j k . (f a j) -> (g j k) -> (f a k)) 
    -> etc . . . 

但我的困惑也停在那裏。我意識到量化描述了Thrist類型的線程,但我不確定是否描述了一個關係適用於第一個參數,或者整個函數,或者誰知道......

顯式量詞僅在括號內或表達式的末尾範圍內。在這種情況下,它們只描述第一個參數,因爲引入的類型變量只在該參數的作用域中。

在這種情況下,它只是表示作爲第一個參數給出的函數在這些類型中必須是完全多態的。作爲一個例子,類型簽名以(a -> a) -> ...開頭的函數可以作爲第一個參數給出not,統一aBool。相反,如果類型簽名以(forall a. a -> a) -> ...開頭,則需要適用於所有可能類型的函數a,唯一的這種函數是id

+0

我想我已經明白了。你開始的類型簽名的其餘部分是:(f a b) - > Thrist g b c - >(f a c)。如果是這樣,我想他們可以一樣輕鬆$>等。 – 2010-12-21 06:32:58

+0

@Jonathan Fischoff:是的。使用的符號只是暗示性的,很像傳統的'm'用於一個類型變量,可能是Monad的一個實例。 – 2010-12-21 06:35:29