2012-02-10 42 views
2

我有問題想清楚這是否可能。任何指針將是真棒如何調用函數並在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 
+2

你想幹什麼'eval'真正做到?我的意思是,如果你放棄了返回值,那麼運行它的意義何在? – shang 2012-02-10 08:52:48

+2

「調用函數」這個短語表明您正在考慮Haskell函數的錯誤方式。 Haskell既是*純*也是*懶*; 「呼叫」意味着嚴格和不純潔。 – 2012-02-10 16:10:02

回答

6

如果您調用包裝在monad中的函數(在本例中爲IO),那麼您還必須位於IO monad中。因此,單子的規則 - 永遠不會被打破。

m :: Int 
m = 3 

d :: IO() 
d = putStr "d" 

f :: IO Int 
f = do d -- Teehee, doodie. 
     return m 
+0

所以我想我使用了一個可怕的例子。這個怎麼樣 eval s = s m = 3 f =(eval s); m 基本上評估一些值,並返回一個不同的值? – sampwing 2012-02-10 06:55:05

+1

@sampwing:你爲什麼要評估價值?如果你沒有編寫特效,最好的辦法就是讓電腦變熱。 (除了某些情況,您需要這樣做以避免過度懶惰;在這些情況下使用'seq')。或者你正在尋找'Debug.Trace.trace'? – hammar 2012-02-10 07:02:51

+0

我會盡力,謝謝。 – sampwing 2012-02-10 07:10:01

3

如果你想在printf樣的方式來調試程序,使用Debug.Trace模塊。

否則見上克拉克Gaebel的答覆 - 你can't¹得到純淨的(非IO)值出IO功能,並putStr只能在IO功能。


¹其實有時也可以,但它是一個複雜的問題

相關問題