SV>SV>f :: Monad m => m Int
SV>f = return 1
SV>g1 :: IO Int
SV>g1 = do
SV> a <- f
SV> return $ a + 1
SV>g2 :: [Int]
SV>g2 = do
SV> a <- f
SV> return $ a + 1
SV>
SV>f -- это действие или нет? Исходя из твоего определения -- нет (поскольку тип не IO t, а Monad m => m t). Но по месту применения выглядит то как действие (в g1), то как значение (в g2). Получается слишком запутано и бессмысленно.
Хм... Продолжая в том же духе
import Control.Applicative
f :: Applicative f => f Int
f = pure 1
g1 :: Maybe Int
g1 = f
g2 :: Int -> Int
g2 = f
Похоже, что понятия "функция" и "значение" в haskell вообще невозможно формально разделить. Этот haskell -- такой haskell