4

イェソドについて(簡単な)話をしなければなりません。そして、はい、.. Haskell も使用したことがないか、ほとんど使用していません。大学講師……か。

だから私は yesod についての本を読んで、いくつかの章で著者は<$>andのようないくつかの演算子を使用してい<*>ます。この演算子が何をするのか、誰か簡単な言葉で説明できますか? その文字をグーグルで検索するのはかなり難しく、Control.Applicative のドキュメントを読もうとすると、正直なところ、Haskell の初心者にとっては入手が困難です。

だから私は誰かが私に簡単な答えを持っていることを願っています:)

これらの演算子が使用されている本の例:

......
personForm :: Html -> MForm Handler (FormResult Person, Widget)
personForm = renderDivs $ Person
    <$> areq textField "Name" Nothing
    <*> areq (jqueryDayField def
        { jdsChangeYear = True -- give a year dropdown
        , jdsYearRange = "1900:-5" -- 1900 till five years ago
        }) "Birthday" Nothing
    <*> aopt textField "Favorite color" Nothing
    <*> areq emailField "Email address" Nothing
    <*> aopt urlField "Website" Nothing
data Person = Person
    { personName          :: Text
    , personBirthday      :: Day
    , personFavoriteColor :: Maybe Text
    , personEmail         :: Text
    , personWebsite       :: Maybe Text
    }
  deriving Show
.....

...................................................

おい、

どうもありがとうございました。驚くべきことに、ほとんどの回答が役に立ちます。悲しいことに、1 つの回答で「解決済み」をヒットできるのは 1 つだけです。どうもありがとう、チュートリアル(私は本当にGoogleで見つけられなかった)はかなり良いです

4

4 に答える 4

9

ほとんどがリンクで構成されている回答を作成するときは、常に細心の注意を払っていますが、これはFunctor と Applicatives を説明し、Monad について少し理解できる素晴らしいチュートリアルの 1 つです。

于 2013-11-07T11:54:41.040 に答える
5

<$>それが単に中置同義語であると言うのは役に立たないと思いますfmap。ただし、これらの例は明確にするのに役立つかもしれません:

GHCi> (*2) <$> (Just 3)
Just 6
GHCi> (*2) <$> (Nothing)
Nothing
GHCi> (*3) <$> (Right 7)
Right 21
GHCi> (*2) <$> (Left "error")
Left "error"
GHCi>  (+ 1) <$> [2,4,6,8]
[3,5,7,9]

それをこれと比較してください:

GHCi> (*) <$> (Just 2) <*> (Just 5)
Just 10
GHCi> (*) <$> (Just 2) <*> (Nothing)
Nothing
GHCi> (*) <$> (Right 3) <*> (Right 7)
Right 21
GHCi> (*) <$> (Left "error") <*> (Right 7)
Left "error"
GHCi> (+) <$> [1,2,3] <*> [10,20,30]
[11,21,31,12,22,32,13,23,33]
GHCi> (+) <$> [1,2,3] <*> []
[]

そして、これに:

GHCi> (Just (*2)) <*> (Just 5)
Just 10
GHCi> (Right (*3)) <*> (Right 7)
Right 21
GHCi> [(+1),(+2),(+3)] <*> [10,20,30]
[11,21,31,12,22,32,13,23,33]

本当に、講義目的で知っておく必要があることはすべて示されているはずです(*) <$> (Just 2) <*> (Just 5)Just (2 * 5)

(ちなみに、最初の一連の例では、左側の関数はすべて適用可能です。)

簡単に言えば、<$>左側の関数を受け取り、右側の「箱の中のもの」のコンテキストに持ち上げて、箱の特別な規則に従う方法で箱の中のものに適用できるようにします (たとえばNothng、チェーン全体が失敗する原因となります)。

<*>左側のボックスで部分的にバインドされた関数を受け取り、右側のボックスの値に適用します。部分的にバインドされた関数は、その引数のすべてではなく一部が与えられた関数です。(*) <$> (Right 3) <*> (Right 7) <*> (Right 4)そのため、あまり役に立たないエラー メッセージが表示さ*れて3失敗7します4

一緒に使用すると<$><*>すべてボックス内で関数をその引数に適用できます。結果は箱に入っています。

これはすべて、ボックス自体がファンクタである場合にのみ実行できます。これは、これらすべての重要な制約です。fmapファンクターは、ある型に適用される関数から別の型に適用される関数に変換できるようにする関数を誰かが定義した関数です (ただし、関数の本質的な性質は変更しません)。必要に応じて、モナド (物事のボックス) は関数を変換する方法を知っているため、関数をそれらの物事に適用できます。

于 2013-11-07T13:38:20.210 に答える
3

<$>ファンクター、アプリカティブ、モナドについてまだ学ぶ準備ができていない場合は、これでとの使い方が直感的にわかるかもしれません<*>。(私自身、他のことを本当に理解する前に、例を見てそれらの使い方を学びました。) <$>andがなければ、<*>そのコードの最初の部分は次のようになります:

......
personForm :: Html -> MForm Handler (FormResult Person, Widget)
personForm = do
    name <- areq textField "Name" Nothing
    bday <- areq (jqueryDayField def
        { jdsChangeYear = True -- give a year dropdown
        , jdsYearRange = "1900:-5" -- 1900 till five years ago
        }) "Birthday" Nothing
    colour <- aopt textField "Favorite color" Nothing
    email <- areq emailField "Email address" Nothing
    url <- aopt urlField "Website" Nothing
    renderDivs $ Person name bday colour email url

つまり、<$><*>度しか使用しないシンボルを大量に作成する必要がなくなります。

于 2013-11-07T12:02:54.180 に答える