1

Haskellpp1 [1,2,3,4][(1,2),(2,3),(3,4)]ここに到達するためにどのように評価するかを理解しようとしています:

1. xnull f [] = []
2. xnull f xs = f xs
3. (/:/) f g x = (f x) (g x)
4. pp1 = zip /:/ xnull tail

私はこのように始めます:

a)  pp1 [1,2,3,4] = (zip /:/ xnull tail) [1,2,3,4]  -- (rule 4).
b)  (zip /:/ xnull tail) [1,2,3,4] 
       = (zip (xnull [1,2,3,4]) (tail) [1,2,3,4])   -- (rule 3)
c)  -- I'm not sure how to continue because xnull receives a function 
    -- and a param, and in this case it only receives a param.

何か助けはありますか?

4

3 に答える 3

4

拡大し続けるだけです:

pp1 [1, 2, 3, 4] = zip /:/ xnull tail $ [1, 2, 3, 4]
                 -- inline (/:/) f g x = f x (g x)
                 --  f = zip, g = xnull tail, x = [1, 2, 3, 4]
                 -- therefore: 
                 = zip [1, 2, 3, 4] (xnull tail $ [1, 2, 3, 4])
                 -- inline the definition of xnull and note that the argument is not null
                 -- so we just want f x, or tail [1, 2, 3, 4]
                 = zip [1, 2, 3, 4] (tail [1, 2, 3, 4])
                 -- evaluate tail
                 = zip [1, 2, 3, 4] [2, 3, 4]
                 -- evaluate zip
                 = [(1, 2), (2, 3), (3, 4)]

オペレーターの重要性。の結合性を指定しなかった(/:/)ため、デフォルトで比較的弱いものに設定されました。したがって、(xnull tail)よりもきつく縛られ(/:/)ます。

また、補足として、 from(/:/)として標準ライブラリに既に存在します。これは十分に一般的であるため、これを確認するのは難しいかもしれませんが、インスタンス for (またはおそらく function としてよりよく理解されている) は、この正確なインスタンスを提供します。からとも呼ばれます。(<*>)Control.ApplicativeApplicativeReaderApplicativeapControl.Monad

zip <*> tail :: [b] -> [(b, b)]
zip <*> tail $ [1, 2, 3, 4] = [(1, 2), (2, 3), (3, 4)]
于 2014-04-25T17:47:35.243 に答える