Предположим, у меня есть функция более высокого порядка, которая выполняет некоторые вычисления с использованием значений, которые она извлекает из ее функционального параметра.Поднимите функцию более высокого порядка в монаду
f :: a -> (b -> c) -> d
где a, b, c, d - некоторые конкретные типы.
Тогда у меня есть функция этого типа
g :: b -> m c
где т некоторая монада.
Теперь есть способ использовать g с f. Это поворот f в функцию, которая производит m d
вместо d
и может использовать g в качестве второго параметра?
Конкретным примером может быть то, что m является монадой IO, f является функцией, вычисляющей сумму n чисел, полученных из ее функционального параметра, и g считывает число из стандартного ввода.
f n g = sum $ map g (1..n)
g :: Int -> IO Int
g _ = readLn
Я знаю, что есть функции для преобразования стандартного ввода в ленивый список, который бы решить эту проблему, но моя реальная ситуация не так проста.
Предположим, у меня есть алгоритм для выполнения чего-то на графике. Алгоритм использует функциональный параметр для определения соседей узла. Это так, что я могу иметь несколько реализаций графика.
Теперь я хочу использовать этот алгоритм с недетерминированным графом (List monad) или графиком, который не полностью известен (возможно, монада). Я знаю, что я мог бы переписать алгоритм для использования монад, а затем использовать монодацию для основного случая, но это единственный способ? Я думаю, было бы легче написать алгоритм без монад.
Возможно ли такое поведение? Я не мог найти причину, почему это не должно быть, но я не смог найти способ, как это сделать.
Чтобы создать картуM с карты, нам нужно знать, что делает карта. Это необходимо? То есть, если функция отображения в вашем примере была какой-то другой функцией (возможно, с неизвестным нам определением), разве мы не сможем это сделать? От вашего ответа, наверное, нет. У вас есть объяснение, почему? Потому что, учитывая любую функцию, я думаю, что можно переписать ее таким образом. Так почему же это вообще невозможно? В любом случае, спасибо за ответ. Я подожду немного и отметю его как правильно, если никто не придумает что-то. –
@MartinKolinek добавил некоторые выписки для вас. –
Спасибо, поэтому я предполагаю, что модификация AST - единственный способ, а это значит, что определение функции должно быть известно. –