我试图理解这个函数(取自 here )
escape :: String -> String
escape =
let
escapeChar c =
case c of
'<' -> "<"
'>' -> ">"
_ -> [c]
in
concat . map escapeChar
我的问题是:
- 根据类型,
escape
是一个接受String
的函数。但似乎在功能定义中它没有收到任何参数。这是如何运作的? escapeChar
和c
有什么关系?这种关系是如何建立的?c
紧接在escapeChar
之后是否有意义?
最佳答案
如果 escapeChar
是使用模式匹配的顶级定义,会不会更简单:
escape :: String -> String
escape = concatMap escapeChar
escapeChar :: Char -> String
escapeChar '<' = "<"
escapeChar '>' = ">"
escapeChar ch = [ch]
[ch]
是一个单例列表,它将 ch::Char
转换为 [ch]::String
。
在 Haskell 中,您可以从每一侧删除/添加一个参数(eta conversion)。 escape
是 eta reduced 形式的
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)
关于Haskell 函数不兼容的类型和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72579566/