2017-05-05 37 views
1

我是Haskell的新手。我自己實施drop在Haskell中檢查推斷類型時的非類型變量參數

myDrop n xs = if n <= 0 || null xs 
       then xs 
       else myDrop (n - 1) (tail xs) 

但我把它當n < 0,例如myDrop -2 [1, 2, 3]。它會引發錯誤:

<interactive>:23:1: error: 
    • Non type-variable argument 
     in the constraint: Num ([t] -> t1 -> [a] -> [a]) 
     (Use FlexibleContexts to permit this) 
    • When checking the inferred type 
     it :: forall t a t1. 
       (Num ([t] -> t1 -> [a] -> [a]), Num (t1 -> [a] -> [a]), Num t, 
       Num t1, Ord t1) => 
       t1 -> [a] -> [a] 

回答

5

它不應該是可能的,當你調用一個函數有兩個不同的參數相同類型的一個將引發類型的錯誤和其他將通過。因此,這裏正在發生其他事情。

尤其

myDrop -2 [1,2,3] 

不解釋你期望的方式。它是這樣解釋

myDrop - (2 [1,2,3]) 

是,與列表[1,2,3]myDrop它的參數減去叫號2(如函數)。換句話說,完全是無稽之談。這就是爲什麼類型錯誤很奇怪。

在Haskell負常量需要括號:

myDrop (-2) [1,2,3]