私は、これらの2つのスニペットがいわゆる「貧しい人の厳密さ分析」の結果が異なる理由を理解するのは苦労しています。データとnewtypeの間の怠惰/厳密さ
最初の例は、(正しいApplicativeのインスタンスを想定)data
を使用する:
data Parser t a = Parser {
getParser :: [t] -> Maybe ([t], a)
}
> getParser (pure (,) <*> literal ';' <*> undefined) "abc"
*** Exception: Prelude.undefined
秒newtype
を使用します。他の違いはありません。
newtype Parser t a = Parser {
getParser :: [t] -> Maybe ([t], a)
}
> getParser (pure (,) <*> literal ';' <*> undefined) "abc"
Nothing
literal x
は、その引数が最初のトークンに一致する場合、入力の一つのトークンを消費成功パーサーです。したがって、この例では、;
がa
と一致しないため失敗します。しかし、data
の例では、次のパーサーが定義されていないことがわかりますが、newtype
の例はそうではありません。
私はthis、this、およびthisを読んでいますが、最初の例が定義されていない理由を理解するのに十分理解していません。この例では、newtype
はです。はdata
よりも怠けていると答えています。 (少なくともone other personもこれで混乱しています)。
data
からnewtype
に変更すると、この例の定義が変更されるのはなぜですか?このインスタンスに、上記data
パーサは未定義ない出力を行うのに対し、仮定(
instance Applicative (Parser s) where
Parser f <*> Parser x = Parser h
where
h xs =
f xs >>= \(ys, f') ->
x ys >>= \(zs, x') ->
Just (zs, f' x')
pure a = Parser (\xs -> Just (xs, a))
:このApplicativeのインスタンスと、未定義の出力を上記data
パーサ:ここ
は、私が発見し、別のことですParser s
の正しいMonadインスタンス):
instance Applicative (Parser s) where
f <*> x =
f >>= \f' ->
x >>= \x' ->
pure (f' x')
pure = pure a = Parser (\xs -> Just (xs, a))
完全なコードスニペットは:
import Control.Applicative
import Control.Monad (liftM)
data Parser t a = Parser {
getParser :: [t] -> Maybe ([t], a)
}
instance Functor (Parser s) where
fmap = liftM
instance Applicative (Parser s) where
Parser f <*> Parser x = Parser h
where
h xs = f xs >>= \(ys, f') ->
x ys >>= \(zs, x') ->
Just (zs, f' x')
pure = return
instance Monad (Parser s) where
Parser m >>= f = Parser h
where
h xs =
m xs >>= \(ys,y) ->
getParser (f y) ys
return a = Parser (\xs -> Just (xs, a))
literal :: Eq t => t -> Parser t t
literal x = Parser f
where
f (y:ys)
| x == y = Just (ys, x)
| otherwise = Nothing
f [] = Nothing
このような質問をするときには、適切なコード(これは 'Functor'と' Monad'インスタンスと 'literal'を含みます)を十分に含んでいれば、ちょっとあなたが指摘したように、たとえ小さな変化であっても行動の違いを生むことができるように、関数を書いた方法を正確に推測する必要があります。 – shachaf
@shachafここでの本当の質問は「私のコードを修正するにはどうしたらいいですか? - 私はすでにそれをしました - しかし、 "厳密さ/怠惰に関して「データ」と「新しいタイプ」の違いは何ですか?申し訳ありませんが、それは質問から明らかではない場合。 –
はい、それでも、コードの内容を知らなくても、コードで何が起こっているのか、どうすれば説明できますか? – shachaf