20

次のうち、あなたが書く可能性が最も高いのはどれですか?

r = zip xs $ map sqrt xs

また

r = [(x, sqrt x) | x <- xs]

インターネット上のサンプルコードは、前者がより豊富で好ましい方法であることを示しているようです。

4

7 に答える 7

27

#haskell に多くの時間を費やす人は、おそらく次のように書くでしょう。

r = map (id &&& sqrt) xs

(&&&)で定義された楽しいコンビネータControl.Arrowです。実際の型シグネチャは、Arrow のすべてのインスタンスに一般化されているため複雑です。しかし、これは の(->)インスタンスと共に使用されることが多くArrow、その結果、次の型シグネチャが生成されます。

(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)
于 2010-07-04T18:22:27.500 に答える
17

私はそれらをあまり頻繁に使用しない傾向がありますが、この場合、リスト内包表記バージョンの方がきれいに見えるので、私はリスト内包表記バージョンを好むと思います。

あなたがポイントフリースタイルに興味があるなら、これも好きかもしれません:

f = zip `ap` map sqrt

ap は Control.Monad に存在し、この場合、SKI 計算でアプリケーションを一般化する S コンビネータと考えることができます。

ap f g x == f x (g x)
ap const const == id

Conal が指摘しているように、これは Monad から Applicative に一般化することもできます (import Control.Applicative):

f = zip <*> map sqrt
于 2010-07-04T18:23:27.053 に答える
13

おそらくmap/zipを書き、後でリスト内包表記を書いておけばよかったと思うでしょう。

于 2010-07-05T02:50:06.230 に答える
11

特定の種類の問題(特にプロジェクトオイラー)では、この特定のケースが頻繁に発生するため、次の小さなヘルパーを作成しました。

with :: (a -> b) -> a -> (a,b)
with f a = (a, f a)

これにより、例を書くことができます。

r = map (with sqrt) xs
于 2010-07-05T03:46:27.543 に答える
11

私はおそらく書くだろう

map (\x -> (x, sqrt x)) xs

ポイントフリーをご希望の場合、上記は(インポート後)Control.Monadと同等です。Control.Monad.Instances

map (ap (,) sqrt) xs

まだ言及されていない別の代替案は

zipWith (,) xs (map sqrt xs)
于 2010-07-08T18:20:13.480 に答える
8

私はどちらかというと「オールドスクール」なzip `ap` map sqrtHaskellier<*>ですap

Applicative は新しいモナドです。(「Cool Haskell Kids は最近何を使っているの?」という意味で)

于 2010-07-05T05:48:45.363 に答える
7

リスト内包表記を使用することはめったにありませんが、どちらもダンディです。コードを読みやすくするものを使用してください。

于 2010-07-04T18:17:26.210 に答える