Вот несколько вопросов, которые вы себе задаете:
- Должно ли
adjacent 3 2 [(1,2),(2,3)]
быть True
?
- Сколько преемников
1
есть на графике [(1,2),(2,3),(1,4),(3,4)]
- Почему
way
должен иметь или x==y
, и adjacent x y ...
кейс?
- На шаге рекурсии
way
тест == False
действительно говорит вам что-то, что позволяет вам выполнить рекурсию на меньшем графике m
?
Как правило, вы не написали сигнатуры типов для функций верхнего уровня. Обычно это очень поучительно, и ваш проект будет более понятным:
type Vertex = Int
type Edge = (Vertex, Vertex)
type Graph = [Edge]
adjacent :: Vertex -> Vertex -> Graph -> Bool
suc :: Vertex -> Graph -> Vertex
way :: Vertex -> Vertex -> Graph -> Bool
Подумайте, имеют ли эти типы смысл, и если они разлагают вашу проблему так, как вы ожидаете, просто подумайте о графиках в целом.
Является ли ваша цель действительно функцией way
или она определяет, подключен ли график? Возможно, вы слишком много предполагаете, каким образом вы можете определить, связан ли график.
Наконец, небольшая часть о синтаксисе Haskell: Как и большинство других языков, приложение функций связывается очень плотно, более жестко, чем операторы ==
и &&
. В отличие от большинства других языков, приложение-функция не использует скобки. Следовательно, adjacent
можно перекодировать как:
adjacent x y [] = False
adjacent x y (mu:m) =
if x == fst mu && y == snd mu then True
else adjacent x y m
Что, в свою очередь, может быть упрощено до:
adjacent x y [] = False
adjacent x y (mu:m) = (x == fst mu && y == snd mu) || adjacent x y m