Я играл со сложными ошибками и мне удалось написать функцию с подписью
getPerson :: IO (Maybe Person)
где Person:
data Person = Person String Int deriving Show
Он работает, и я написал его в do-notation следующим образом:
import Control.Applicative
getPerson = do
name <- getLine -- step 1
age <- getInt -- step 2
return $ Just Person <*> Just name <*> age
где
getInt :: IO (Maybe Int)
getInt = do
n <- fmap reads getLine :: IO [(Int,String)]
case n of
((x,""):[]) -> return (Just x)
_ -> return Nothing
Я написал эту функцию с целью создания сложных возможных сбоев. Хотя у меня мало опыта с монадами, отличными от Maybe и IO, это похоже на то, что если бы у меня был более сложный тип данных со многими другими полями, вычисления цепочек не были бы сложными.
Мой вопрос в том, как я могу переписать это без нотации? Поскольку я не могу привязывать значения к именам, таким как имя или возраст, я не уверен, с чего начать.
Причина для запроса - просто улучшить мое понимание ( → =) и (< * > ) и составить неудачи и успехи (не прерывать мой код с неразборчивыми одностроками).
Изменить: я думаю, что я должен уточнить: "Как мне переписать getPerson без предустановления", мне не нужна функция getInt в два раза меньше.