2012-11-20 38 views
2

我是學生,在編程課程中我們必須學習Haskell。所以我是新手,並沒有那麼多的經驗。此外,我不熟悉在論壇中發佈問題。如何調用一個集成在Haskell類型中的函數?

所以首先我將張貼在圖書館,我有工作。 (DA:確定性自動機)

type State = Integer 
type DA = (State, State -> Char -> State, State -> Bool) 
type ListDA = (State, [((State, Char), State)], [State]) 

a :: DA 
a = (0, delta, (==1)) 
    where 
    delta 0 'a' = 1 
    delta 1 'a' = 1 
    delta 2 'a' = 1 
    delta 0 'b' = 2 
    delta 1 'b' = 2 
    delta 2 'b' = 2 

toDA :: ListDA -> DA 
toDA (start, delta, final) = (start, deltaFun delta, (`elem` final)) 
    where deltaFun dl = curry (fromMaybe 0 . flip lookup dl) 

戶田函數採用在其列表表示的自動機,將其轉換成自動機。這個功能和圖書館的其他部分由講座主席給出。

現在的問題是讀取字符串後寫型

advance :: DA -> State -> String -> State 

此函數採用的自動機的狀態和一個字符串並返回自動機的狀態的功能。

理念是清晰爲止。 DA型自動機具有狀態轉換函數增量。所以函數「advance」必須以某種方式調用delta函數。但是我怎樣才能訪問一個集成在一個類型中的函數呢?

回答

4

您使用模式匹配:

advance :: DA -> State -> String -> State 
advance (start, step, accept) fromState chars = .... 

type關鍵字只是介紹type synonymsDA只是三重(Integer, Integer -> Char -> Integer, Integer -> Bool)的同義詞。

您的命名是混亂的。 deltaa自動機的定義是一個狀態轉換函數,但在toDA函數的定義,一個名爲delta參數列表。 ListDA類型也是三元組(一個不同的 - 一個狀態,一個轉換列表和一個可接受狀態列表)的同義詞。

這裏是如何可以被編碼,使用遞歸循環:

advance (_, step, _) fromState chars = go fromState chars 
    where 
    go s []  = ... -- stop, and produce the state as the answer, 
         -- when the input string (list of chars) has ended 
    go s (c:cs) =   -- if not, then 
     let s2 = step s c -- make one step 
     in go .......  -- and loop with new values 

注意我們沒有必要在這裏對startaccept變量,所以我們可以使用匿名變量模式_那裏。此外,stepState -> Char -> State類型的函數,並且指示函數調用中使用的參數的順序。即它接受一個狀態和一個字符,併產生一個新的狀態。

如果你不知道哈斯克爾在所有的,你可能會從閱讀(和工作過),一個很好的教程,like this one受益。

最後,既然您已經說過您「不熟悉在論壇中發佈問題」,請詳細閱讀accepting answersFAQ

+0

感謝您的快速支持。我試圖找出一個解決方案,但沒有成功。我嘗試了'advance :: DA - > State - > String - > State advance(start,step,accept)State Char:Chars = advance(start,step,accept)(step state char)實現一個遞歸函數來遍歷要讀取的字符串的元素。將其加載到GHCi中會產生解析錯誤。那麼我的錯誤在哪裏? – 0niveau

+0

@ user1838559:變量必須以小寫字母開頭,所以使用「chars」而不是「Chars」。另外,像':'這樣的運算符比函數應用程序的優先級低,即使在模式中,所以你需要在括號(char:chars)的周圍加上括號。 – hammar

+0

@hammer:謝謝你的回答。我很抱歉提出這樣一個愚蠢的問題,並且因爲這些拼寫錯誤而浪費了你的時間;-) – 0niveau

3

函數實際上不是從任何其它類型的在Haskell數據的任何不同,直到對其進行評估 - 在該點不存在全局定義的函數,通過模式匹配而得到的函數變量,或之間的任何差未命名的lambda。

在這種情況下,如內斯說,這是最容易獲得通過圖案的名稱相匹配的功能,

advance (start, delta, terminate) = result 

,那麼你可以在此範圍內,使用deltaterminate像任何其他功能:

where result = delta start 'b' -- or whatever, conditional on terminate... 
相關問題