Обернуть вызов AJAX в функцию, которая принимает URL (и любые другие данные) в качестве параметра (ов) и возвращает ответ. Затем, по вашему мнению, вызовите функцию вместо прямого вызова AJAX.
function doAjax( url, data, elem, callback )
{
return $.ajax({
url: url,
data: { ajax: data },
cache: false,
success: function(response) { callback(response, elem, xhr); }
});
}
...
<input type='button' value='Go get it' onclick='doAjax( <%= Url.Action ...
Я не уверен, что это лучше, чем использовать вызов Ajax на странице, а не в файле JS, если только вы часто не используете один и тот же шаблон.
Add a functional dependency:
{-# LANGUAGE ..., FunctionalDependencies #-}
class Mapping k v m | m -> k where
...
The errors you got before were because the program was ambiguous about which key type to use in certain places, hence the errors about the type variable k1
. The functional dependency allows the key type to be deduced from the map type (by declaring that there is only one possible answer), which deals with this problem.
Код для демонстрации ответа Ганеша:
{-# LANGUAGE FlexibleInstances, FunctionalDependencies, MultiParamTypeClasses, StandaloneDeriving, UndecidableInstances #-}
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
class Mapping k m | m -> k where
empty :: m v
insert :: k -> v -> m v -> m v
search :: k -> m v -> Maybe v
delete :: k -> m v -> m v
instance Ord k => Mapping k (Map.Map k) where
empty = Map.empty
search = Map.lookup
insert = Map.insert
delete = Map.delete
data Trie m v = Trie {
trValue :: Maybe v,
trChildren :: m (Trie m v)
}
deriving instance (Show v, Show (m (Trie m v))) => Show (Trie m v)
trieMod :: Mapping k m => Maybe v -> [k] -> Trie m v -> Trie m v
trieMod val [] trie = trie { trValue = val }
trieMod val (x:xs) trie =
trie { trChildren = insert x newChild children }
where
children = trChildren trie
newChild = trieMod val xs prevChild
prevChild = fromMaybe empty . search x $ children
instance Mapping k m => Mapping [k] (Trie m) where
empty = Trie { trValue = Nothing, trChildren = empty }
search [] trie = trValue trie
search (x:xs) trie =
search xs =<< search x (trChildren trie)
insert key val = trieMod (Just val) key
delete = trieMod Nothing
type TernarySearchTree a = Trie (Map.Map a)
Кстати: если бы функциональные зависимости не существовали, нам, вероятно, пришлось бы пойти на компромисс с раздражающим интерфейсом и использовать таблицы функций вместо классов типов.