Haskell Переменная двусмысленного типа - я потерялся? - PullRequest
2 голосов
/ 04 ноября 2011

Итак, идея в том, что я бы взял следующий код, используемый для запуска запросов MongoDB в haskell

И я хотел бы превратить это в это, чтобы я мог притвориться, что функция запуска является "db", как в обычном драйвере Монго.

db <- connectDb "127.0.0.1" "testdb" 
db $ delete $ select [] "mycollection"

Вот функция, которую я написал для этого:

mdb :: (MonadIO m) => String -> String -> IO (Action m a -> m (Either Failure a))
mdb hostname dbname = do
    pipe <- runIOE $ connect $ host hostname
    return (access pipe master (pack dbname))

Я получил тип, оставив его нетипизированным, а затем спросив ghci, что это за тип. Я едва понимаю это.

Так вот вопрос

Когда я заставляю мою программу иметь ТОЛЬКО db <- connectDb "127.0.0.1" "testdb" и не использую ее, она выходит из строя с этой ошибкой неоднозначного типа: https://gist.github.com/1337864 - Как я могу сделать ее однозначной? Это плохая идея сделать такую ​​абстракцию? Как бы вы это сделали?

1 Ответ

6 голосов
/ 04 ноября 2011

Мне всегда хочется ответить на эти вопросы "это потому, что ваш тип неоднозначен". Например, если вам дали значение:

MonadIO m => (Action m a -> m (Either Failure a))

И сказал, что монада m является конкретной монадой (а не просто какой-либо), можете ли вы сказать, какая она? Нет.

Если вы не используете возвращаемое значение в контексте, который делает очевидным, к какой категории принадлежит Monad m, вам необходимо предоставить компилятору дополнительную информацию:

db <- connectDB "127.0.0.1" "testdb" :: IO (Action IO a -> IO (Either Failure a))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...