私はインストラクターが私たちに与えたいくつかのハスケル関数の例を扱っていました。しかし、私は、この特定の機能を理解していなかった。このコードはどのようにこの出力を生成しますか?
f x = [not a | a<-[x,not x], a]
をし、それが出力として[False]
生成するが、私は理由を理解していませんでした。これを詳細に説明できますか?
私はインストラクターが私たちに与えたいくつかのハスケル関数の例を扱っていました。しかし、私は、この特定の機能を理解していなかった。このコードはどのようにこの出力を生成しますか?
f x = [not a | a<-[x,not x], a]
をし、それが出力として[False]
生成するが、私は理由を理解していませんでした。これを詳細に説明できますか?
このリスト内包表記は、3つの部分から構成されています
[ not a | a <- [x, not x], a ]
-- ^yield^generator ^filter
ジェネレータはは、このように2つの要素を持つリスト上a
反復をすることができます。これらの要素は[True,False]
または[False,True]
です(値はx
)。しかし、常に同じ値(要素の順序だけが異なります)。
次部分がa
に来るフィルタ。フィルターは、述部がTrue
の値を保持します。ここで述語は単にa
であるため、a = True
の構成を保持します。 a
がTrue
の場合、とFalse
の両方がa
であることから、とという項目を考慮に入れることになります。その値の
、我々はnot a
をもたらします。今度はnot True
はFalse
です。その結果、x
の値にかかわらず(True
またはFalse
)、常に[False]
が生成されます。
Prelude> let f x = [not a | a<-[x,not x], a]
Prelude> f True
[False]
Prelude> f False
[False]
あなたはまた、等式推論でこれを理解することができますので、結果として
。
f x = do
a <- [x, not x]
guard a
pure (not a)
Desugar
do
表記:リストモナドに
f x = [not a | a <- [x, not x], a]
Desugar:リスト内包で開始
f x = [x, not x] >>= \ a -> guard a >> return (not a)
インラインリストの>>=
の定義:
f x = concatMap (\ a -> guard a >> return (not a)) [x, not x]
インラインguard
/>>
:
f x = concatMap (\ a -> if a then return (not a) else []) [x, not x]
インラインreturn
:
f x = concatMap (\ a -> if a then [not a] else []) [x, not x]
concat (map g xs)
からconcatMap g xs
展開:
f x = concat (map (\ a -> if a then [not a] else []) [x, not x])
map
インライン:
がFalse
であり、そして
x
が
False
ある場合
x
は
True
と
[False]
された場合に
if not x then [not (not x)] else []
は
[]
と評価された場合
x
は
True
と
[]
ある場合
if x then [not x] else []
は
[False]
に評価されることは
注意。したがって、あなたが持っている:
f x = if x then [False] ++ [] else [] ++ [False]
そして[False] ++ [] == [] ++ [False] == [False]
以降を、あなたが得る:
f x = [False]
ありがとうございました!したがって、** yield部分が 'a'でフィルタが' not a'の場合、結果は '[TRUE]' ** **でしょう。また、「なぜフィルタは述語が「真」である値だけを保持しますか?それはルールなのです。もし私の心に最初に来たのは、それがどんな価値でもありうるからです。 ** filter **の部分は – Snxby
を説明してください@Snxby:いいえ、フィルタが 'a 'でなければ、' a = False'だけが許され、したがって 'a'を返します。結果は '[False]'になります。 –
@Snxbyリストの理解フィルタは、述語が「True」を返す値を保持するのはなぜですか?どのような質問をしたいのかに応じて、ここには2つの可能な回答があります。 「これが行動であることをどのように知っていますか」と尋ねようとする場合、答えは[レポートを見る](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-420003.11)です。 。 「なぜこの行動が選ばれたのか」と尋ねるのであれば、リストのいくつかの要素を維持することが一般的な必要性であり、これはその必要性に対処するための自然で簡単な方法です。 –