2013-03-31 67 views
9

匹配在學校exercice格局GHCI

我有這個功能

bar :: Float -> Float -> Float 
bar x 0 = 0 
bar 0 y = 0 
bar x y = x * y 

我在GHC鍵入它作爲

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y 

和評估

bar foo 0 
bar 0 foo 

我要求修改欄使用'|'所以我想要做的事,如:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y 

但在ghci中我得到了

parse error on input '=' 

我怎樣才能做到這一點在GHCI? 使用模式匹配('|')的事實會改變什麼嗎?

+1

你原來的'bar'使用模式匹配。你想了解[衛兵](http://en.wikibooks.org/wiki/Haskell/Truth_values#Guards)。 – dave4420

+2

你可能特別聰明,只需簡單地寫'let bar |否則=(*)'...... – leftaroundabout

+3

刪除第一個守衛之前的'=',let bar x y | x == 0 = ... | y == 0 = ... |否則= ...'。 –

回答

16

看語法使用守衛:

bar x y | x == 0  = 0 
     | y == 0  = 0 
     | otherwise = x * y 

寫在一行中GHCI:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y 
9

使用文件

不要直接鍵入的代碼到ghci中除非它真的是單線。

將您的代碼保存在名爲PatternMatch.hs的文本文件中,並通過鍵入將其加載到ghci中。

:l PatternMatch.hs 

,然後如果你做出改變(並保存),您可以重新加載該文件在ghci中鍵入

:r 

或者,你能說出你的文件之後,鍛鍊他們的,或者只是有一個reusablle Temp.hs如果它真的是一次性代碼。

通過將內容保存在文本文件中,您可以更輕鬆地編輯和重用。

模塊

稍後您將收集在一起使用適當的模塊相關的功能,使他們能夠進口到其他程序。例如,你可以有

module UsefulStuff where 

pamf = flip fmap 

保存在一個文件名爲UsefulStuff.hs,然後在另一個文件中,你可以

import UsefulStuff 

,然後使用功能從UsefulStuff那裏。

對於你現在正在做的事情來說,模塊是矯枉過正的,但是獲得編輯,保存,重新編譯,測試和重複的工作流程,你可以節省很多努力。

+0

歡迎來到21世紀。文件屬於帶銅柄的機櫃。在這個時代,那些酷酷的孩子們在JSFiddle中展示他們的代碼,並在Run按鈕上跳動,或者在Swift沙箱中游蕩以獲得即時滿足,但這個答案不會贏得許多潛在的Haskell程序員。真正很酷的孩子可能會前往[Shen](http://www.shenlanguage.org/),在那裏他們可以擁有所有功能性編程和類型檢查他們想要的善良,然後一些。哦,是的,它有一個REPL,允許多行輸入「開箱即用」,輸入簽名等等。 – ack

+1

@ack我認爲你把我誤會爲一個關心孩子做什麼的人,而我實際上只關心幫助人們充分利用我也使用的工具。感謝有關假冒的垃圾郵件。 – AndrewC

+0

如果你關心這麼多,也許你可以參考[這個答案](http://stackoverflow.com/a/8443096/588561),它不需要使用文件。 – ack