我試圖理解這個功能(取自這里)
escape :: String -> String
escape =
let
escapeChar c =
case c of
'<' -> "<"
'>' -> ">"
_ -> [c]
in
concat . map escapeChar
我的問題是:
- 根據型別,
escape是一個接受String. 但似乎在函式定義中它沒有收到任何引數。這是如何運作的? escapeChar和之間有什么關系c?這種關系是如何建立的?緊接著c來escapeChar有意義嗎?
uj5u.com熱心網友回復:
如果escapeChar是使用模式匹配的頂級定義會更容易:
escape :: String -> String
escape = concatMap escapeChar
escapeChar :: Char -> String
escapeChar '<' = "<"
escapeChar '>' = ">"
escapeChar ch = [ch]
[ch]是一個單例串列,它變成ch :: Char一個[ch] :: String.
在 Haskell 中,您可以從/向每一側洗掉/添加一個引數(eta 轉換)。escape是eta 的簡化形式
escape :: String -> String
escape str = concatMap escapeChar str
就像,如果你想為你定義一個同義詞,( )你有等效的寫法。我覺得add = ( )最清楚的是,您正在識別這兩個功能。雙方的論點相同,因此我們不指定它們。
add :: Int -> Int -> Int
add = ( )
add a = ( ) a
add a = (a )
add a b = ( ) a b
add a b = a b
這些是等效的寫作方式escape:
escape = concat . map escapeChar
escape str = concat (map escapeChar str)
uj5u.com熱心網友回復:
該map函式有一個簽名(a -> b) -> ([a] -> [b]),這意味著 map 函式接受一個函式(escapeChar 函式)并回傳一個使用該函式轉換串列的函式(escapeChar 函式)。map escapeChar回傳一個函式,該函式對字串中的每個字符使用 escapeChar 函式來轉換字串。
uj5u.com熱心網友回復:
根據型別,escape 是一個接受字串的函式。但似乎在函式定義中它沒有收到任何引數。這是如何運作的?
concat . map escape回傳一個函式。該函式將接受一個字串并對其進行處理。
escapeChar和之間有什么關系c?這種關系是如何建立的?緊接著c來escapeChar有意義嗎?
是的,它是函式的第一個(也是唯一一個)引數。它是一個Char演員,escapeChar函式將其映射Char到String. 因此,該let子句定義了一個函式escapeChar :: Char -> String,然后將在concat . map escape(或者可能更好concatMap escape)中使用。Char這會將給定的每個映射String到一個子字串,然后將它們連接在一起作為結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490527.html
標籤:哈斯克尔
上一篇:如何使用型別類傳達“小于”約束?
