Понимание ошибки типа функции подключения Haskell postgresql - PullRequest
2 голосов
/ 17 апреля 2011

Я теперь программист на Java, занимаюсь чтением и изучением haskell.Я пытаюсь написать простую программу для подключения (и отключения) к базе данных postgres с помощью драйвера HDBC postgres.Для простоты у меня нет никакой другой логики в этом.

Выдает ошибку типа функции.Я сделал правильный код, и если я удаляю разъединение, он работает с определенным типом.

Может кто-нибудь пролить свет на то, что мне не хватает, определяя тип для этой функции?Я хотел бы примирить вашу помощь.

спасибо!

пример кода:

import Database.HDBC
import Database.HDBC.PostgreSQL
import Database.HaskellDB
import Database.HaskellDB.HDBC.PostgreSQL

tryConnect :: Int  -> (Database -> IO Connection) -> ()   
tryConnect id =
   do
     c <- postgresqlConnect [("host","dbhost"),("dbname","db1"),("user","user1"),("password","test")]
     disconnect c
     return ()

Я получаю следующую ошибку от GHCi

   Couldn't match expected type `(Database -> IO Connection) -> a'
       against inferred type `IO ()'
In a stmt of a 'do' expression: disconnect c
In the expression:
    do { c <- postgresqlConnect
                [("host", "dbhost"), ("dbname", "db1"), ....];
         disconnect c;
         return () }
In the definition of `insrt':
    insrt id
            = do { c <- postgresqlConnect [("host", "dbhost"), ....];
                   disconnect c;
                   return () }

Ошибка, загруженные модули: нет.

1 Ответ

1 голос
/ 17 апреля 2011

Проблема в том, что вы не предоставили достаточно аргументов для postgresqlConnect. Его сигнатура типа [(String, String)] -> (Database -> m a) -> m a, но вы указали только первый аргумент. Если указать postgresqlConnect его второй аргумент, это решит проблему, и вы сможете изменить объявление типа обратно на Int -> IO ().

РЕДАКТИРОВАТЬ: ответ ниже совершенно неправильно. Мой плохой.

Ну, подпись типа tryConnect :: Int -> (Database -> IO Connection) -> (). Обычно это указывает на то, что функция принимает Int и (Database -> IO Connection) и возвращает (), но единственный параметр, который вы указали в определении функции, это id. Следовательно, у вас есть функция, которая принимает Int и возвращает новую функцию с сигнатурой типа (Database -> IO Connection) -> ().

Это было бы хорошо, за исключением того, что тело функции не соответствует этой сигнатуре. Выражение do возвращает значение IO (), а не ожидаемую функцию, поэтому вы получите ошибку, поскольку компилятор получил значение, отличное от ожидаемого.

Итак, в заключение кажется, что в сигнатуре типа есть параметр, который вы не использовали в реальной функции. Либо удалите эту функцию из сигнатуры типа, либо измените функцию на tryConnect id func = ... вместо tryConnect id = ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...