8

getZipList が ghc のどこで定義されているか知りたいです。Control.Applicative には、ZipList のこの定義があります。

newtype ZipList a = ZipList { getZipList :: [a] }

ZipLists を使用する 1 つの方法は (LYAH から):

ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100,100]

[101,102,103]

getZipList が何を返すかをどのように知っているのか興味があります。おそらく、newtype キーワードについて何かが欠けているのでしょう。ありがとう!

4

2 に答える 2

12

だけnewtypeでなく、と同じように機能しdataます。あなたが気づいていないように見えるのは、名前付きフィールド構文です。

newtype ZipList a = ZipList { getZipList :: [a] }

とほぼ同じです

newtype ZipList a = ZipList [a]

getZipList :: ZipList a -> [a]
getZipList (ZipList xs) = xs

dataただし、名前付きフィールドの構文を使用すると、更新とパターンマッチングがより便利になります。特に、複数のフィールドを持つタイプの名前付きフィールドの場合は、はるかに便利です。

名前付きフィールドは、ラップされた値から含まれるデータを抽出するアクセサー関数を(暗黙的に)定義します。

于 2013-01-18T20:59:19.183 に答える
3

シークレットは newtype 定義にはありませんが、 <*> に対して持つアプリケーション インスタンスにあります。

instance Applicative ZipList where  
pure x = ZipList (repeat x)  
ZipList fs <*> ZipList xs = ZipList [f x | (f,x) <- zip fs xs]

デフォルトのリストは代わりにこのようなものであり、それが違いの由来です

instance Applicative [] where  
pure x = [x]  
fs <*> xs = [f x | f <- fs, x <- xs]  
于 2013-01-18T21:02:32.977 に答える