次のうち、あなたが書く可能性が最も高いのはどれですか?
r = zip xs $ map sqrt xs
また
r = [(x, sqrt x) | x <- xs]
インターネット上のサンプルコードは、前者がより豊富で好ましい方法であることを示しているようです。
次のうち、あなたが書く可能性が最も高いのはどれですか?
r = zip xs $ map sqrt xs
また
r = [(x, sqrt x) | x <- xs]
インターネット上のサンプルコードは、前者がより豊富で好ましい方法であることを示しているようです。
#haskell に多くの時間を費やす人は、おそらく次のように書くでしょう。
r = map (id &&& sqrt) xs
(&&&)
で定義された楽しいコンビネータControl.Arrow
です。実際の型シグネチャは、Arrow のすべてのインスタンスに一般化されているため複雑です。しかし、これは の(->)
インスタンスと共に使用されることが多くArrow
、その結果、次の型シグネチャが生成されます。
(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c)
私はそれらをあまり頻繁に使用しない傾向がありますが、この場合、リスト内包表記バージョンの方がきれいに見えるので、私はリスト内包表記バージョンを好むと思います。
あなたがポイントフリースタイルに興味があるなら、これも好きかもしれません:
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
おそらくmap
/zip
を書き、後でリスト内包表記を書いておけばよかったと思うでしょう。
特定の種類の問題(特にプロジェクトオイラー)では、この特定のケースが頻繁に発生するため、次の小さなヘルパーを作成しました。
with :: (a -> b) -> a -> (a,b)
with f a = (a, f a)
これにより、例を書くことができます。
r = map (with sqrt) xs
私はおそらく書くだろう
map (\x -> (x, sqrt x)) xs
ポイントフリーをご希望の場合、上記は(インポート後)Control.Monad
と同等です。Control.Monad.Instances
map (ap (,) sqrt) xs
まだ言及されていない別の代替案は
zipWith (,) xs (map sqrt xs)
私はどちらかというと「オールドスクール」なzip `ap` map sqrt
Haskellier<*>
ですap
。
Applicative は新しいモナドです。(「Cool Haskell Kids は最近何を使っているの?」という意味で)
リスト内包表記を使用することはめったにありませんが、どちらもダンディです。コードを読みやすくするものを使用してください。