В Monads for natural language semantics Chung-Chieh Shan показывает, как монады могут использоваться, чтобы дать однозначное единообразное повторение стандартных учетных записей некоторых видов естественных языковых явлений (опрос, фокус, интенсиональность и количественное определение). Он определяет две композиции, A_M
и A'_M
, которые полезны для этой цели.Необычная подпись типа
Первый - это просто ap
. В poweret monad ap
- это приложение без детерминированных функций, которое полезно для обработки семантики запросов; в монаде читателя это соответствует обычному анализу экстенсионального состава; и т.д.
Это имеет смысл. Операцию вторичный состав, однако, имеет тип подписи, который просто выглядит странно для меня:
(<?>) :: (Monad m) => m (m a -> b) -> m a -> m b
(Shan называет его A'_M
, но я буду называть его <?>
здесь.) Это определение того, что можно было ожидать от типы; это соответствует довольно близко к ap
:
g <?> x = g >>= \h -> return $ h x
Я думаю, я могу понять, как это делает то, что он должен в контексте бумага (ручка вопрос берущих глаголов для местоимения служит интенсиональную композицию и т.д.). То, что он делает, не очень сложно, но немного странно видеть, что он играет такую центральную роль здесь, так как это не идиома, которую я раньше видел в Haskell.
Ничего полезного не появляется в Hoogle для m (m a -> b) -> m a -> m b
или m (a -> b) -> a -> m b
.
Это знакомо кому-либо из других контекстов? Вы когда-нибудь писали эту функцию?
'вещь f = ap f. return' – yairchu
Я немного смутился, потому что на самом деле я написал несвязанный комбинатор '(>)' 'как' liftA2 (\ b t e -> if b then t else e) '. –