2017-11-21 12 views
1

グラフ用の関数をいくつか実装したいと思います。Haskell:Typedeclarationとしての機能

型宣言がある:一つの機能については

type Graph = Knoten -> [Knoten] 

私はリスト[Knoten]を通過する必要があります。私は正しいアルゴリズムを持っていますが、[Knoten]にアクセスする方法はわかりません。ここで

は私の試みです:

ist_minimal :: Graph -> Bool 
ist_minimal g = minimalHelp g 

minimalHelp :: Knoten -> [Knoten] -> Bool 
minimalHelp _ [] = True 
minimalHelp k (m:ms) 
| elem m ms = False 
| otherwise = minimalHelp k ms 

ist_minimal :: Graph -> Bool 
ist_minimal (k ks) = minimalHelp (k ks)  --k=Knoten, ks=[Knoten] 

minimalHelp :: Knoten -> [Knoten] -> Bool 
minimalHelp _ [] = True 
minimalHelp k (m:ms) 
| elem m ms = False 
| otherwise = minimalHelp k ms 

私の配慮だった、Knoten [Knoten]

答えて

1
ようなグラフを書くことが可能であるとき

Graph = Knoten -> [Knoten] 

こと210それは動作しません。 Knoten -> [Knoten] -> BoolKnoten -> ([Knoten] -> Bool)を意味し、Graph -> Bool(Knoten -> [Knoten]) -> Boolを意味し、これらは非常に異なるタイプである。

Knoten -> [Knoten](とGraph)で行うことができるのは、基本的には​​で呼び出すことだけです。この操作から関数を構築する必要があります。例えば。

ist_minimal g = minimal_help k (g k) 
    where k = ... 

...だろうminimal_helpを呼び出し可能な一ist_minimal :: Graph -> Knotenはあなたのタイプ​​の何かを与えるために充填する必要があります。g kはタイプ[Knoten]を持つことになりますので、このコードはそのよう​​と[Knoten]からminimal_help渡しますタイプが必要です。

+0

関数に 'Applicative'インスタンスを使用して、' ist_minimal g = minimal_help <*> g'にも注意してください。 – chepner

+0

@chepner私は、このような質問をする人にとって、それはあまりにも早すぎて気を散らすと思う:) –

+0

それを使うべきではないと示唆していないが、私が与えられたパターン実際にはより高い抽象化によって捕らえられている)。他に何もない場合は、「Applicative」の仕組みに対する直感を高めるのに役立つもう一つの例です。 – chepner

関連する問題