Haskell, проблемное типизированное связывание в простой функции идентификации [duplicate]

Ошибка произошла здесь из-за использования одинарных кавычек ('). Вы можете поместить свой запрос следующим образом:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Он использует mysql_real_escape_string для предотвращения SQL-инъекции. Хотя мы должны использовать расширение MySQLi или PDO_MYSQL для обновленной версии PHP (PHP 5.5.0 и более поздних версий), но для более старых версий mysql_real_escape_string это будет трюк.

5
задан sqd 11 October 2015 в 15:20
поделиться

2 ответа

Являются ли переменные типа в предложениях «где» в том же пространстве имен с родителями?

No *. Это становится немного легче, если вы думаете о foo :: s -> s в терминах foo :: forall s. s -> s. В конце концов, переменная типа указывает, что функция работает для любого типа s. Давайте добавим четкие количественные значения к вашему коду:

{-# LANGUAGE ExplicitForAll #-}

data T s = T (s -> s)

foo :: forall s. T s -> s -> s
foo (T f) x = bar x where
    bar :: forall s. s -> s
    bar a = f a

Как вы можете видеть, есть два forall s.. Но одно в bar неверно. В конце концов, вы не можете выбрать любой s, но тот, который уже используется в s. Это можно сделать, включив ScopedTypeVariables:

{-# LANGUAGE ScopedTypeVariables #-}

data T s = T (s -> s)

--     vvvvvvvv  explicit here
foo :: forall s. T s -> s -> s
foo (T f) x = bar x where
    --     vvvvvv  same as above here
    bar :: s -> s
    bar a = f a

Однако есть некоторые трюки, чтобы избавиться от ScopedTypeVariables. Например, в этом случае:

data T s = T (s -> s)

foo :: T s -> s -> s
foo (T f) x = (bar `asTypeOf` idType x) x where

    bar a = f a

    idType :: a -> a -> a
    idType a _ = a

-- For completion, definition and type of 'asTypeOf'
-- asTypeOf :: a -> a -> a
-- asTypeOf x _ = x

Для любого x :: s термин idType x имеет тип s -> s, а asTypeOf принуждает обе иметь одинаковый тип.

В зависимости от вашего фактического кода, что-то вроде этого может быть более или менее выполнимым.


* Ну, в этом случае, поскольку можно использовать ScopedTypeVariables, см. более позднюю часть ответ.

7
ответ дан Zeta 1 September 2018 в 04:32
поделиться

ScopedTypeVariables действительно являются решением, но есть дополнительные требования к их использованию: вы должны указать явные forall s в типе подписей, объявляющих переменные, которые вы хотите использовать, например:

foo :: forall s. T s -> s -> s

Это так, что значение сигнатур в коде не зависит от того, включено ли расширение или нет.

5
ответ дан Ørjan Johansen 1 September 2018 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: