2

Haskellに同じコードが2つあり、どちらも特定の位置(パラメーターn)でリストを分割する必要がありますが、一方が機能している間、もう一方は機能していません。なぜそれが発生するのでしょうか。

divide [] _ = ([],[])
divide (h:t) n 
       | n>0 = ( h:list1 , list2 )
       | otherwise = ([],h:t)
       where (list1, list2) = divide t (n-1)

上記のコードは問題なく機能しますが、以下のコードは機能しません。

divide [] _ = ([],[])
divide (h:t) n 
       | n>0 = ( h:( divide t (n-1) ) , divide t (n-1) )
       | otherwise = ([],h:t)

ghciは次のメッセージを出します:

split.hs:3:29:

   Couldn't match expected type '[a0]' with actual type '([a0], [a1])'
   In the return type of a call of 'divide'
   In the second argument of '<:>', namely ' divide t (n-1) '
   In the expression: h: divide t (n-1)

編集:

ちょっと注意してください、私はそれを仮定しています

where (list1, list2) = divide t (n-1) 

と同等です

where list1 = divide t (n-1)
      list2 = divide t (n-1)

私の仮定は正しいですか?間違った仮定は、さらに悪い結論につながる可能性があります。

4

1 に答える 1

9

あなたの仮定は間違っています。

where (list1, list2) = divide t (n-1) 

と同等です

where pair = divide t (n-1) 
      list1 = fst pair
      list2 = snd pair

左側(list1, list2)は右側に怠惰にマッチするパターンです。複数の変数に同じ値を割り当てることはありません。

于 2012-12-13T04:57:28.513 に答える