2017-04-07 61 views
2

我是Haskell的新手,在理解語言的一些概念時遇到了一些麻煩。haskell中表達式的類型

我有以下表現:

\f x → (f x,f 1)

而且從我的理解,我可以說:

  • 起初,我真的不能說是因爲我什麼˚F沒有信息, 所以我說它可以是任何東西。

    然後,從(FX)的應用判斷我可以說,它是類型的 功能A-> B,其中x ::一個

    然後從應用判斷(F 1)I可以說一個是 整數類型,因此x是同一類型

然後,我真的不明白,爲什麼整個表達式的類型爲:

(Integer → b) → Integer → (b, b)

我有一點猜測,我會說:

(Integer → b)是函數f的類型,所以它接收和整數並返回一個類型B

Integer是x的類型

(b b)是兩個函數的調用類型嗎?

有人可以指點我正確的方向嗎?謝謝

+0

你明白了非常正確的。因爲在GHCi中,文字'1'默認爲'Integer',所以'\ f x - >(f x,f 1)'將被限制爲'(整數 - > b) - >整數 - >(b,b)''。因此推斷爲函數的'f'需要一個'Integer'。由於'x'在元組元素之一傳遞給'f',所以'x'必須是'Integer'。 '(b,b)'只是一個元組,其中'b'是'f'的返回類型。 – bheklilr

+0

非常感謝!這是一個很好的解釋!欣賞它。 –

+0

請您告訴我爲什麼這個'c b a = a b'的類型是'c :: t1 - >(t1 - > t) - > t'? @bheklilr –

回答

2

你是對的。

由於f適用於1 :: Integer,因此f :: Integer -> b

而且因爲f也適用於x,所以x :: Integer

而且由於lambda的結果是f的應用程序的元組,因此結果類型爲(b, b)

因此,lambda的類型是一種函數,它將f類型的東西加入到Integer(b, b)的元組中。

編輯

c b a = a b 

假設b :: t1

由於a適用於b,我們可以說a :: t1 -> t

由於c需要的bt1)類型的東西的at1 -> t)類型的東西的a應用的結果bt),我們可以說,c :: t1 -> (t1 -> t) -> t

+0

謝謝您的回答!我很感激。 @pat。請你善良,告訴我爲什麼這個'c :: t1 - >(t1 - > t) - > t'是'c b a = a b'的類型?這是我現在唯一不瞭解的事情。 –

+0

沒有必要,我已經自己理解了,很抱歉打擾你。 –

4

整個lambda採用函數fx作爲輸入;它產生一對 ;該對的第一個元素是將f應用於x的結果,第二個元素是將f應用於1的結果。從f 1可知,對f的輸入必須限於Num類型類。

getPair :: Num a => (a -> b) -> a -> (b, b) 
getPair =   \f   x -> (f x, f 1) 

唯一的限制是Num a =>

getPair id 8.9 => (8.9, 1.0) 
getPair (\x -> x > 0) (-9.8) => (False, True)