2017-06-01 18 views
2

私はインストラクターが私たちに与えたいくつかのハスケル関数の例を扱っていました。しかし、私は、この特定の機能を理解していなかった。このコードはどのようにこの出力を生成しますか?

f x = [not a | a<-[x,not x], a] 

をし、それが出力として[False]生成するが、私は理由を理解していませんでした。これを詳細に説明できますか?

答えて

5

このリスト内包表記は、3つの部分から構成されています

[ not a | a <- [x, not x], a ] 
-- ^yield^generator ^filter 

ジェネレータはは、このように2つの要素を持つリスト上a反復をすることができます。これらの要素は[True,False]または[False,True]です(値はx)。しかし、常に同じ値(要素の順序だけが異なります)。

次部分がaに来るフィルタ。フィルターは、述部がTrueの値を保持します。ここで述語は単にaであるため、a = Trueの構成を保持します。 aTrueの場合、とFalseの両方がaであることから、という項目を考慮に入れることになります。その値の

、我々not aをもたらします。今度はnot TrueFalseです。その結果、xの値にかかわらず(TrueまたはFalse)、常に[False]が生成されます。

Prelude> let f x = [not a | a<-[x,not x], a] 
Prelude> f True 
[False] 
Prelude> f False 
[False] 
+0

ありがとうございました!したがって、** yield部分が 'a'でフィルタが' not a'の場合、結果は '[TRUE]' ** **でしょう。また、「なぜフィルタは述語が「真」である値だけを保持しますか?それはルールなのです。もし私の心に最初に来たのは、それがどんな価値でもありうるからです。 ** filter **の部分は – Snxby

+0

を説明してください@Snxby:いいえ、フィルタが 'a 'でなければ、' a = False'だけが許され、したがって 'a'を返します。結果は '[False]'になります。 –

+1

@Snxbyリストの理解フィルタは、述語が「True」を返す値を保持するのはなぜですか?どのような質問をしたいのかに応じて、ここには2つの可能な回答があります。 「これが行動であることをどのように知っていますか」と尋ねようとする場合、答えは[レポートを見る](https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-420003.11)です。 。 「なぜこの行動が選ばれたのか」と尋ねるのであれば、リストのいくつかの要素を維持することが一般的な必要性であり、これはその必要性に対処するための自然で簡単な方法です。 –

0

あなたはまた、等式推論でこれを理解することができますので、結果として

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であり、そして xFalseある場合 xTrue[False]された場合に if not x then [not (not x)] else [][]と評価された場合 xTrue[]ある場合 if x then [not x] else [][False]に評価されることは

注意。したがって、あなたが持っている:

f x = if x then [False] ++ [] else [] ++ [False] 

そして[False] ++ [] == [] ++ [False] == [False]以降を、あなたが得る:

f x = [False] 
関連する問題