Я работаю над проблемой 9 Project Euler, и у меня есть вопрос о том, как лучше извлечь значение внутри другой монады. Проблема просит найти 'а', 'B', 'C', которые удовлетворяют:Haskell - Extract Возможно, в Монаде
- а^2 + Ь^2 = с^2
- а + Ь + с = 1000
Я написал следующий код, который решает эту проблему:
problem9 :: (Integral a) => a -> [(a, a, a)]
problem9 n =
do
a <- [1..n]
b <- [1..a]
c <- fromJustM (findC a b)
guard (a + b + c == n)
return (a, b, c)
«с» может быть вычислена аналитически, но, так как он не может существовать, я, может быть, возвращающий значение.
findC :: (Integral a) => a -> a -> Maybe a
findC a b = ... (implementation) ...
Чтобы извлечь возможно значение внутри списка монады, я создал следующую функцию:
fromJustM :: (Monad m) => Maybe a -> m a
fromJustM (Just a) = return a
fromJustM Nothing = fail ""
Похоже, что это должно быть общей операцией, так есть стандартная библиотечная функция, которая делает это, или есть более идиоматический способ сделать это?
Почему бы не дать 'findC' более полиморфный тип (например, следуя предложениям ответа здесь) (Альтернатива f, Интеграл a) => a -> a -> f a')? –