私はハスケルを完全に新しくしています。コンストラクタ内からデータを引き出す
私はいくつかの情報層を持っています。各レイヤーは独自の方法で計算されますが、出力には型付き要素のリストだけがあります。
layer1 :: MyData -> [Element1]
layer1 mydata = unique calculations
layer2 :: MyData -> [Element2]
layer2 mydata = even more unique calculations, using layer1
layer3 :: MyData -> [Element3]
layer3 mydata = completely genious layer of profound information
.....
ここでは、N個の関数をパラメータ化できないため、切り離したままにしておきます。
次に、これらのレイヤーで同様の機能を実行したいと考えています。
私のmightsは簡単な方法
transform1 :: MyData -> [Int]
transform1 mydata = zipWith f (layer1 mydata) constList
transform2 :: MyData -> [Int]
transform2 mydata = zipWith f (layer2 mydata) constList
transform3 :: MyData -> [Int]
transform3 mydata = zipWith f (layer3 mydata) constList
......
でそれを行うしかし、ここで明確には統一のいくつかの種類を作るために招待されます。 Like
universalTransform :: Layer -> [Int]
universalTransform layer = zipWith f layer constList
Ok。だから今、私はLayer
抽象
data Layer = Lay1 [Element1] | Lay2 [Element2] | Lay3 [Element3]
data LayerName = Lay1Name | Lay2Name | Lay3Name
をする必要があるそれから私は
take :: LayerName -> MyData -> Layer
take lname mydata = case lname of
Lay1Name -> Lay1 (layer1 mydata)
Lay2Name -> Lay2 (layer2 mydata)
Lay3Name -> Lay3 (layer3 mydata)
派遣コレクタを作成する必要があり、何とかそれはhugerとhugerになり、最悪の問題は私のzipWith f
リストを望んでいるということです。そしてuniversalTransform
layer
にはではなく、のリストです。抽象化はLayer
です。私はLayer
の中から[ElementsX]
の中から自由にしようとしていましたが、成功しませんでした。
私は間違った方向に向かっています。
どうすればいいですか?統一ですが、適切な方法で、好きではありません... ehmmm ...私自身。
。なぜあなたはそれをする必要がありますか?あなたは高次関数より何を得ていますか?あなたはその道を進むことで解決しようとしている問題は何ですか? –
DRYの概念。コードを統一するために、それは強く繰り返されます。レイヤーの作成は解決策ではありません。しかし私は他の道を見つけませんでした。それはハスケルの私の二日目です。たぶん私は明らかな解決策を見逃してしまったでしょう。 – Dahan
@AlexisKingや他の誰かが間違っていると私を修正する気がします...あなたは要素リストの種類が異なるため、 'レイヤー'抽象化を作成するようになりました。しかし、 '(MyData - > [a]) - > MyData - > [Int]'型の 'universalTransform'を書けば、これを回避できませんか? – mnoronha