2

この 1 週間か 2 週間、私のコンピューター サイエンスのクラスで、「原則変換」によって関数を単純化および短縮する方法を示すように求められました。私たちはこれらの課題についてフィードバックを受け取っていないので、私がそれを正しく行っているかどうかわかりません.

これが私の最新の演習であり、解決策への私の試みです:

Show by a series of principled transformations that we can define:
    char :: Char -> Parser Char
    char c = satisfy (c==)
as
    char :: Char -> Parser Char
    char = satisfy . (==)

私の試み:

char c = satisfy (c==)
=> char c = satisfy . c==
=> char c = satisfy . flip ==c
=> char = satisfy . flip ==
=> char = satisfy . (==)

フィードバックをいただけますか?割り当て用に提供されたコードは不完全であるため、コンパイルして各変換が機能するかどうかをテストすることはできません。変換を自分でテストするために同様の関数セットを作成しようとしましたが、残念ながら私は Haskell が非常に苦手で、初めてなので、それもわかりませんでした。

4

2 に答える 2

3

ここにはいくつかのエラーがあります。まず、関連する型を書き留めます。

char :: Char -> Parser Char
satisfy :: (Char -> Bool) -> Parser Char
(==) :: Char -> Char -> Char

これをより快適にするために、いくつかの署名を意図的に制限しました。

char c = satisfy (c==)
char c = satisfy . c== -- This is a parse error, not sure what you meant
char c = satisfy . flip ==c -- Also wrong, flip swaps arguments, 
                            -- but this function has only one argument
char = satisfy . flip == -- Eta conversion is right, this code is
                         -- still a parse error - you should check code with ghci or winhugs

私のアプローチは

char c = satisfy   (c==)
char c = satisfy $ (\c -> \d -> c == d) c -- Explicitly undo sections
char c = satisfy . (\c d -> c == d) $ c -- f(g x) === (f . g) x by the
                                        -- definition of composition
char c = (satisfy . (==)) c
char = satisfy . (==)
于 2013-11-08T04:45:16.393 に答える