Functor
は、2つのデータ表現の間のマッピングに役立ちます。時々それは反復に似ていることがあります。この一般的なFunctor
のtypeclassを使用すると、データ型(Maybe
、List
、Tree
)の実際の構造を無視して、そのデータにのみフォーカスを当てることができます。そのデータ型の作成者は、そのデータ構造がどのように横断/反復されるのかを知っているので、そのデータ型のインスタンス(Functor
の形式)を実装する必要があります。我々が提供しなければならないのは、f
という機能があり、それはa
になり、b
にマップされます。例えば:
import Data.Char (toLower)
data Tree a = Node a [Tree a]
deriving Show
instance Functor Tree where
fmap f (Node a ts) = Node (f a) (map (fmap f) ts)
main :: IO()
main = do print (toLower `fmap` (Node 'F' [])) -- Node 'f' []
print (toLower `fmap` (Just 'F')) -- Just 'f'
print (toLower `fmap` "FOO") -- "foo"
我々はfmap
組み合わせる同じコードtoLower
を用いたもの文字を小文字にすることができました。
したがって、Functor
インスタンスがパターンマッチングを使用して内部データを抽出し、受け取ったコールバック関数f
をこれらの各結果に適用することを定義するときにすべきことは何ですか。
<$>
というモジュールには、fmap
のインシニックスシノニムがあります。
main :: IO()
main = do print (toLower <$> (Node 'F' [])) -- Node 'f' []
print (toLower <$> (Just 'F')) -- Just 'f'
print (toLower <$> "FOO") -- "foo"
[Typeclassopedia](http://www.haskell.org/wikiupload/e/e9/Typeclassopedia.pdf)は、ファンクターについて学ぶのに適したもう1つの場所です。構文のどの部分が特に問題を引き起こしていますか? –
私はtsは何ですか? – user997112
@ user997112 'ts'は、' [Tree a] '型の' Node'の第2フィールドの値に束縛されているので、 'ts'はそのノードが保持するサブツリーです。 –