我正在尝试理解此函数(取自here)
escape :: String -> String
escape =
let
escapeChar c =
case c of
'<' -> "<"
'>' -> ">"
_ -> [c]
in
concat . map escapeChar
我的问题是:
1.根据类型,escape
是一个接受String
的函数。但是在函数定义中,它似乎没有接受任何参数。这是如何工作的?
escapeChar
和c
之间的关系是什么?这种关系是如何建立的?c
紧跟在escapeChar
之后是否有意义?
3条答案
按热度按时间ppcbkaq51#
如果
escapeChar
是使用模式匹配的顶级定义,会不会更容易一些:[ch]
是一个单例列表,它将ch :: Char
转换为[ch] :: String
。在Haskell中,您可以从/向每边(eta conversion)移除/添加参数。
escape
是的 *eta约简 * 形式就像,如果你想定义一个同义词
(+)
,你有等价的写法。我觉得add = (+)
是最清楚的,你是在标识两个函数。两边的参数是一样的,所以我们不指定它们。以下是
escape
的等效写法:第一个
yduiuuwa2#
根据类型,escape是一个接受字符串的函数。但是在函数定义中,它似乎不接受任何参数。这是如何工作的?
concat . map escape
返回一个 * 函数 *。该函数将接受一个字符串并对其进行处理。escapeChar
和c
之间的关系是什么?这种关系是如何建立的?c
紧跟在escapeChar
之后是否有意义?是的,这是第一次(也是唯一的)参数。它是一个
Char
字符,并且escapeChar
函数将该Char
Map到String
上。这会将给定String
的每个Char
Map到一个子字符串,然后将这些子字符串连接在一起。sqxo8psd3#
map
函数有一个签名(a -> b) -> ([a] -> [b])
,这意味着map函数接受一个函数(escapeChar函数),并返回一个使用该函数转换列表的函数(escapeChar函数)。map escapeChar
返回一个对字符串中的每个字符使用escapeChar函数转换字符串的函数。