我對 Haskell 編程相當陌生。我目前正在嘗試熟悉一些用于決議 parsec 的源代碼。
有兩件事讓我印象深刻:
type Parser = String -> Tree
根據作者的說法,這應該是一個函式的宣告?實際上應該是這樣的:
Parser :: String -> Tree right?
另一個歧義在以下代碼中:
item :: Parser Char
item = P (\inp -> case inp of......
據我了解,這是函式的型別宣告,對嗎?
這不應該是
item :: Parser -> Char
謝謝你幫助我
最好的問候克里斯托夫
uj5u.com熱心網友回復:
我假設你正在看這個幻燈片。作者實際上說的是:
在像 Haskell 這樣的函式式語言中,決議器自然可以被視為函式。
-- A parser is a function that takes a string -- and returns some form of a tree type Parser = String -> Tree
作者的意思是決議器是函式,而這種決議器函式的型別可能是 type Parser,作者將其定義為 type 的型別別名String -> Tree。
也就是說,在Parser使用定義型別別名之后:
type Parser = String -> Tree
可以將實際的決議器宣告為具有型別Parser(相當于 type String -> Tree),如下所示:
-- here is a very bad parser capable of parsing only one possible program
myTreeParser :: Parser
myTreeParser "2*3 4" = Plus (Times (Num 2) (Num 3)) (Num 4)
myTreeParser _ = error "Parser only supports the program '2*3 4'"
考慮類似的陳述:“在支持代數資料型別的語言(如 Haskell)中,點自然可以表示為浮點數對: type Point = (Double, Double)。目的不是定義這樣的點,而是通過以下方式描述點的型別Point定義為等效于(Double, Double)浮點數對型別的型別別名。
作者繼續改進Parser型別,指出 (1) 決議器可能不會使用他們的所有輸入,因此應該回傳(Tree, String)而不只是回傳Tree,(2) 他們可能能夠以多種方式決議他們的輸入(最重要的是在“零”方式,如果無法決議輸入),因此應該回傳一個可能的決議結果串列[(Tree, String)],并且(3)可能需要決議除 a 以外的其他內容Tree,因此應該泛化為將輸入決議為任意型別:
type Parser a = String -> [(a, String)]
這定義了一個引數化的型別別名Parser,這意味著它本身不是一個完整的型別,而是or or是一個完整的型別,表示決議 a , , or的決議器。ParserParser TreeParser CharParser DoubleTreeCharDouble
所以宣告:
item :: Parser Char
是正確的書面。使用此Parser型別別名的最終版本:
type Parser a = String -> [(a, String)]
該型別Parser Char等價于以下型別:
String -> [(Char, String)]
也就是說,item' 的型別是決議器的型別,它接受輸入String并嘗試決議輸入的開頭以生成值,加上被決議部分之后Char的其余部分。String最終,它回傳零個或多個這樣的可能決議。(這個特定的定義item回傳一個零決議的空串列,表示不可能決議,或者回傳一個恰好一個決議的單例串列,表示決議成功。)
uj5u.com熱心網友回復:
type Parser = String -> Tree根據作者的說法,這應該是一個函式的宣告?實際上應該是這樣的:
更準確地說,Parser是型別的型別別名,String -> Tree它是一個接受 aString并回傳 a的函式Tree。
Parser一個新的型別名稱也是如此。
另一方面,將其與
Parser :: String -> Tree
這宣告了一個名稱為 的Parser函式String -> Tree。因此,在第一種情況下,我們宣告一個新型別,在第二種情況下,我們宣告一個具有特定型別的名稱。
正如評論中提到的,這應該是
parser :: String -> Tree
因為函式名應該以小寫字母開頭,而型別名應該以大寫字母開頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474037.html
標籤:哈斯克尔
