リスト内包表記を使用して true のみを出力したい
listTo::(a->b)->[a]->[b]
listTo f list=[f(x)|x<-list,x==True]
isTrue::Int->Bool
isTrue n
|n>=5 =True
|n<5 =False
listTo isTrue[1,2,3,4,5,6,7]
しかし、これはうまくいきません。それはなぜです?
リスト内包表記を使用して true のみを出力したい
listTo::(a->b)->[a]->[b]
listTo f list=[f(x)|x<-list,x==True]
isTrue::Int->Bool
isTrue n
|n>=5 =True
|n<5 =False
listTo isTrue[1,2,3,4,5,6,7]
しかし、これはうまくいきません。それはなぜです?
[f(x)|x<-list,x==True]
これは、「がから来てに等しいf x
1のリストをください。x
list
x
True
しかし、あなたの場合、list
数値のリストとして渡しました。f x
そして、 returnの数値のみを含めたいようですTrue
。x
したがって、 を比較しTrue
て発行するのではなくf x
、反対のことを行う必要があります。もっと似たもの:
[x | x <- list, f x == True]
しかし、これをもう少し改善することができます。は、2 つの引数を取り、それらが等しいかどうかを==
返す関数です。そうである場合は返され、ある場合は返されます。努力の無駄のようです。あなたはただ書くことができます!True
False
f x == True
True
f x
True
False
f x
False
f x
[x | x <- list, f x]
これが、リスト内包表記を使用してこれを行う方法です。しかし、郵便配達員が指摘したように、まさにこれを行うための標準ライブラリ関数がすでに存在します: filter
. これは、物事がどのように機能するかを学ぶためではなく、物事を成し遂げるためにコードを書く場合に使用するものです。
1は、括弧で囲まれた部分式に適用されるf(x)
だけで解析されることに注意してください。括弧を付けても何も起こらないので、 とまったく同じです。関数適用のための Haskell の構文はC ライクではなく、関数の後に引数が単純に書き出される (必要に応じて空白で区切られる) ものです。括弧は、優先順位の制御とタプルの形成にのみ使用されます。引数リストを括弧で囲んで複数の引数で関数を呼び出そうとすると、さらに多くのエラーが発生します。f
(x)
x
f x
function(arg1, arg2, arg3)
function arg1 arg2