4

リスト内包表記を使用して 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]

しかし、これはうまくいきません。それはなぜです?

4

3 に答える 3

5
[f(x)|x<-list,x==True]

これは、「がから来てに等しいf x1のリストをください。xlistxTrue

しかし、あなたの場合、list数値のリストとして渡しました。f xそして、 returnの数値のみを含めたいようですTruexしたがって、 を比較しTrueて発行するのではなくf x、反対のことを行う必要があります。もっと似たもの:

[x | x <- list, f x == True]

しかし、これをもう少し改善することができます。は、2 つの引数を取り、それらが等しいかどうかを==返す関数です。そうである場合は返され、ある場合は返されます。努力の無駄のようです。あなたはただ書くことができます!TrueFalsef x == TrueTruef xTrueFalsef xFalsef x

[x | x <- list, f x]

これが、リスト内包表記を使用してこれを行う方法です。しかし、郵便配達員が指摘したように、まさにこれを行うための標準ライブラリ関数がすでに存在します: filter. これは、物事がどのように機能するかを学ぶためではなく、物事を成し遂げるためにコードを書く場合に使用するものです。


1は、括弧で囲まれた部分式に適用されるf(x)だけで解析されることに注意してください。括弧を付けても何も起こらないので、 とまったく同じです。関数適用のための Haskell の構文はC ライクではなく関数の後に引数が単純に書き出される (必要に応じて空白で区切られる) ものです。括弧は、優先順位の制御とタプルの形成にのみ使用されます。引数リストを括弧で囲んで複数の引数で関数を呼び出そうとすると、さらに多くのエラーが発生します。f(x)xf xfunction(arg1, arg2, arg3)function arg1 arg2

于 2013-04-25T00:28:44.873 に答える