2015-05-04 50 views
3

我是Purescript(以及Haskell)的新手,我被卡住了一個無法統一的錯誤。 起初我:Purescript - 不能統一類型

newtype Domain = Domain String 

newtype Keyword = Keyword String 

type Result = { 
     domain :: Domain, 
     occurred :: Boolean, 
     position :: Number, 
     quality :: Number 
    } 

is_min_pos :: Maybe Result -> Maybe Result -> Maybe Result 
is_min_pos Nothing Nothing = Nothing 
is_min_pos Nothing y = y 
is_min_pos x Nothing = x 
is_min_pos x y = if y.position < x.position then y else x  

這是給我的錯誤

Cannot unify type 
    Prim.Object 
with type 
    Data.Maybe.Maybe 

我以爲這是因爲它是希望x和y爲類型也許記錄。因此,爲了明確起見,我將代碼更改爲,按類型進行模式匹配。

data Result = Result { 
     domain :: Domain, 
     occurred :: Boolean, 
     position :: Number, 
     quality :: Number 
    } 

is_min_pos (Result x) (Result y) = if y.position < x.position then y else x 

現在我得到的錯誤

Cannot unify type 
    Data.Maybe.Maybe Processor.Result 
with type 
    Processor.Result 

這是指這部分

y.position < x.position -- in the first case 

,並在第二種情況下

Result x -- on the pattern matching side 

我工作的進一步

type Results = List Result 

get_item_with_min_position :: Results -> Maybe Result 
--get_item_with_min_position [] = Nothing 
get_item_with_min_position results = foldl is_min_pos Nothing results 

我使用「與foldl」從摺疊。我不知道如何模式匹配一​​個空列表。如果我可以,我會類型簽名更改爲

is_min_pos :: Maybe Result -> Result -> Maybe Result 

我現在得到的錯誤

Cannot unify type 
    Prim.Object 
with type 
    Data.Maybe.Maybe 

這是可以理解的,因爲在

foldl is_min_pos Nothing results 

結果的類型是List結果 is_min_pos的期望也許結果

什麼是一個乾淨的方法來解決這個問題?

回答

5

Maybe類型有兩個數據構造函數:Nothing,您正確匹配,並且Just。如果你想匹配Maybe a,其中確實包含包含的值,則應匹配Just的構造函數。

您需要如下修改最後一種情況:

is_min_pos (Just x) (Just y) = if y.position < x.position 
            then Just y 
            else Just x 

這裏,Just x的類型爲Maybe Result,根據類型簽名是正確的,所以x的類型爲Result,這樣你就可以使用.position訪問者讀取其position屬性。

+0

謝謝你,菲爾,這工作。 – naruvimama