2014-04-20 21 views
4

有可能查詢ghci的統一類型?如何查詢統一類型爲ghci?

例如,如果我想知道(Int -> Bool)(a -> Bool)之間的統一類型,我該如何查詢ghci?

我想解決的是練習13.23從第三版Haskell: The Craft of Functional Programming

如何使用Haskell系統檢查兩個類型表達式 是否可以統一,如果有的話,他們的統一性是什麼?提示:你可以在Haskell虛擬 定義中定義的值,鋯石說,被等同於 自己:這樣定義

zircon = zircon 

值可以聲明爲有你希望的任何類型。

謝謝,
塞巴斯蒂安。

回答

5

一種方法是使用asTypeOf:: a -> a -> a。作爲一個函數,asTypeOf不是很有趣,但它的類型很好:它強制它的兩個參數和它的返回類型統一。所以:

> :t asTypeOf (undefined :: Int -> Bool) (undefined :: a -> Bool) 
asTypeOf (undefined :: Int -> Bool) (undefined :: a -> Bool) 
    :: Int -> Bool 

所以你可以看到,這兩種類型統一爲Int -> Bool。對於一個稍微更有趣的例子,讓我們統一Maybe af (Bool, c)

> :t asTypeOf (undefined :: Maybe a) (undefined :: f (Bool, c)) 
asTypeOf (undefined :: Maybe a) (undefined :: f (Bool, c)) 
    :: Maybe (Bool, c) 

在另一方面,對於練習的目的,我鼓勵你嘗試用手工做的統一。這並不難,一旦你掌握了它,並且是一種你會反覆使用的技能。

+1

它也可以使用列表構造函數':t [undefined :: Maybe a,undefined :: f(Bool,c)]' –