bind
関数(>>=
)が署名を有する:慣用的方法
m a -> (a -> m b) -> m b
しかし、Iシグネチャを持つ関数をしたい:
m (t a) -> (a -> m (t b)) -> m (t b)
具体的には、私は整数与えられた機能を持っている、それがIO内に整数のリストを返します。
f :: Int -> IO [Int]
ですが、IO of list of Integers
に適用したいと思います.2つのコンテナ、つまりIOに含まれるリストにラップされているため、通常のバインド関数を使用することはできません。 Searching on hoogleは役に立ちません。私は私が欲しいものを得るために2つのヘルパー関数を使用しています
f :: Int -> IO [Int]
f x = do
return $ [x-10, x+10]
:
するのは、関数の実装があるとしましょう:私はこれを実装するには、次のアプローチを使用しています
f' :: [Int] -> IO [Int]
f' xs = do
list <- traverse f xs
return $ join list
f'' :: IO [Int] -> IO [Int]
f'' xs = do
ys <- xs
f' ys
上記の機能はありますが、これをhaskellで実装する方がより良い/慣用的な方法があるかどうかを知りたいのですが?
私はすでにそれを持っているので、私は解決策を捜しているわけではありません。私はこれを解決するための慣用的な方法が欲しい。 – mandark
あなたは答えをまだ読んだことがあるか分かりませんが、「より一般的には、どのタイプの関数がどのタイプの関数がm1 m2? - (m1 m2 b) - > m1 m2 b?重複した質問。答え:一般的なケースでは不可能です。 2番目の答えを見てください。 – 4castle
'f''と' f'''の型シグネチャを取り除き、 'f'をパラメータに抽象化すると、型チェッカによって推論される最も一般的な型が得られます。これらの実装は、 '' = 'と' fmap'ではなく 'do'表記の使用を除いては、慣用的ですが、純粋に文体的な問題です。この質問は完全に意見に基づいています。コードが十分ではないこと、つまり「より良い」バージョンが達成したいと思っていることを明確にすることはできますか? – user2407038