我有問題想清楚這是否可能。任何指針將是真棒如何調用函數並在haskell中返回不同的值? (W/o monads)
我不知道確切的語法,但像
m = 3
d = putStr "d"
f = d ; m
這樣的東西,它會調用函數d
,並返回m
價值沒有被Maybe m
?
編輯:
我所尋找的是更喜歡呢?
eval s = s
m = 3
f = (eval s) ; m
我有問題想清楚這是否可能。任何指針將是真棒如何調用函數並在haskell中返回不同的值? (W/o monads)
我不知道確切的語法,但像
m = 3
d = putStr "d"
f = d ; m
這樣的東西,它會調用函數d
,並返回m
價值沒有被Maybe m
?
編輯:
我所尋找的是更喜歡呢?
eval s = s
m = 3
f = (eval s) ; m
如果您調用包裝在monad中的函數(在本例中爲IO),那麼您還必須位於IO monad中。因此,單子的規則 - 永遠不會被打破。
m :: Int
m = 3
d :: IO()
d = putStr "d"
f :: IO Int
f = do d -- Teehee, doodie.
return m
如果你想在printf
樣的方式來調試程序,使用Debug.Trace
模塊。
否則見上克拉克Gaebel的答覆 - 你can't¹得到純淨的(非IO
)值出IO
功能,並putStr
只能在IO
功能。
¹其實有時也可以,但它是一個複雜的問題
你想幹什麼'eval'真正做到?我的意思是,如果你放棄了返回值,那麼運行它的意義何在? – shang 2012-02-10 08:52:48
「調用函數」這個短語表明您正在考慮Haskell函數的錯誤方式。 Haskell既是*純*也是*懶*; 「呼叫」意味着嚴格和不純潔。 – 2012-02-10 16:10:02