Я попытался адаптировать некоторые упражнения из прекрасной книги Land of Lisp Конрада Барски, чтобы выучить Haskell. Идея состоит в том, чтобы сделать простой текстовый игровой движок.
Конкретно я пробовал:
type Clau = String
type Descripcio = String
type Valors = [String]
-- NOTE : Ideas of types http://learnyouahaskell.com/making-our-own-types-and-typeclasses
data Lloc = Lloc String String String deriving (Show)
llocSituacio :: Lloc -> String
llocSituacio (Lloc situacio _ _ ) = situacio
llocDireccio :: Lloc -> String
llocDireccio (Lloc _ direccio _) = direccio
llocPas :: Lloc -> String
llocPas ( Lloc _ _ pas) = pas
nodes :: [(Clau,Descripcio)]
nodes = [("living-room","you are in the living-room. a wizard is snoring loudly on the couch.")
,("garden","you are in a beautiful garden. there is a well in front of you.")
, ("attic", "you are in the attic. there is a giant welding torch in the corner.")]
edges :: [([Char], [Lloc])]
edges = [ ("living-room", [(Lloc "garden" "west" "door"), ( Lloc "attic" "upstairs" "ladder") ])
, ("attic", [(Lloc "living-room" "east" "door")])
, ("garden", [(Lloc "living-room" "east" "door")])]
describePath :: Lloc -> String
describePath e = "There is " ++ llocPas e ++ " going " ++ llocDireccio e ++ " from here."
Сначала кажется, что работает хорошо. Например:
*TextGame> describePath (Lloc "living-room" "east" "door")
"There is door going east from here."
Но когда я пытаюсь применить функцию к списку, я получаю эту ошибку:
situacio = "garden"
map (describePath) (lookup situacio edges)
<interactive>:2:22: error:
• Couldn't match expected **type ‘[Maybe Lloc]’**
with actual **type ‘Maybe [Lloc]’**
• In the second argument of ‘map’, namely ‘(lookup situacio edges)’
In the expression: map (describePath) (lookup situacio edges)
In an equation for ‘it’:
it = map (describePath) (lookup situacio edges)
Ошибка ясна, но мне не удается ее решить. Я хочу проанализировать список значений Maybe и напечатать путь с помощью функции descriptionPath, которая хорошо работает:
Любые идеи? Кроме того, если кто-то хочет поделиться альтернативами или считает, что этот код мог бы быть больше в стиле Haskell, пожалуйста, не стесняйтесь говорить об этом.