Haskell: введите вопрос о классах

Обернуть вызов 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, если только вы часто не используете один и тот же шаблон.

7
задан yairchu 19 June 2009 в 20:48
поделиться

2 ответа

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.

14
ответ дан 6 December 2019 в 08:45
поделиться

Код для демонстрации ответа Ганеша:

{-# 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)

Кстати: если бы функциональные зависимости не существовали, нам, вероятно, пришлось бы пойти на компромисс с раздражающим интерфейсом и использовать таблицы функций вместо классов типов.

7
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

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