2017-05-05 17 views
1

私はHaskellを初めて使用しています。私自身でdropを実装しています。Haskellで推論された型をチェックするときに、型が可変ではない引数

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

しかし、私はたとえば、myDrop -2 [1, 2, 3]ため、n < 0それを呼び出します。これは、エラーが発生します:

<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

あなたが二つの異なる引数と同じタイプの 1で関数を呼び出すときタイプエラーが発生しますし、他が通過することを可能にすべきではありません。そこで何か他のことが起こっています。特に

myDrop -2 [1,2,3] 

は、あなたが期待する方法で解釈されません。これは、myDropから引数としてリスト[1,2,3]と(関数として)と呼ばれる番号2を引いているこの

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

ように解釈されます。言い換えれば、まったくナンセンス。そういうわけで、タイプエラーはとても奇妙なものです。 Haskellの負の定数で

は括弧が必要です。

myDrop (-2) [1,2,3] 
関連する問題