2016-08-05 62 views
0

我學習Haskell對我自己和我通過鍛鍊在獨聯體homework 194困惑:CIS 194鍛鍊混亂

練習1之前,我們就可以開始評估表達式和語句,我們需要一些方法來存儲並查找變量的狀態。我們將一個狀態定義爲類型爲String - > Int的函數。這使得查找變量的值非常容易;在狀態中查找 「A」的值,我們只需調用狀態「A」。每當我們分配一個變量時,我們都想更新程序狀態。實現以下功能: 延長::狀態 - >字符串 - >內部 - >國家

提示:您可以使用輸入狀態作爲一個黑盒子爲其他 比你分配一個變量。

例子: 讓ST」 =延長ST聖 「A」 5 」 「A」 == 5

我根本不明白它的要求和示例。這是如何提供查找「A」價值的方法?由於State被定義爲type State = String -> Intextend的類型是String->Int->String->Int->State

回答

4

關閉。鑑於

type State = String -> Int 
extend :: State -> String -> Int -> State 

「真正的」 類型的extend時(注意括號)

extend :: (String -> Int) -> String -> Int -> (String -> Int) 

-- because -> is right-associative 
extend :: (String -> Int) -> String -> Int -> String -> Int 

的第一個參數extendString -> Int類型的函數,而不是一個String值。


extend並不意味着查找「A」的值;它意在創造一個新的狀態,其中「A」的值具有給定的值。例如:

let st' = let st "A" = 3 in extend st "A" 5 
let st'' = extend "B" 2 st' 

st'仰視 「A」 應該產生的5的值,不3.同樣地, 「B」 中未st'定義,但在st''

>>> st' "A" 
5 
>>> st'' "A" 
5 
> st' "B" 
*** Exception: <interactive>:2:5-15: Non-exhaustive patterns in function st' 
>>> st'' "B" 
2  
+1

很抱歉,如果這是真的小學,但這是否意味着(在你的例子)'ST 「A」'是'(與字符串>智力)'了'extend'的部分(即'State')類型?如果是,那麼它應該跟着一個字符串? – Liumx31

+1

沒錯。在調用'extend st'A「5'時,'st'需要有'String - > Int'類型。在'let st'A'= 3'表達式中,我使用模式匹配來定義一個部分函數st,它在「A」的輸入上返回3。沒有爲任何其他輸入值定義「st」。如果你正確地定義了'extend',那麼'st''也不會被定義爲任何其他輸入,並且'st''只被定義爲「A」和「B」。 – chepner

+0

其實我想知道'st'A''在'extend st「中是否有'5'類型(String - > Int),那麼不應該在'extend'的後面加上'String' '(String - > Int)[它是st「A」] - > String - > Int ...' – Liumx31