我试图理解这个函数(取自这里)
escape :: String -> String
escape =
let
escapeChar c =
case c of
'<' -> "<"
'>' -> ">"
_ -> [c]
in
concat . map escapeChar我的问题是:
escape是一个接受String的函数。但在函数定义中,它似乎没有收到任何论证。这是怎么回事?escapeChar和c之间的关系是什么?这种关系是如何建立的?c在escapeChar之后出现有意义吗?发布于 2022-06-10 21:02:52
如果escapeChar是使用模式匹配的顶级定义,会更容易吗?
escape :: String -> String
escape = concatMap escapeChar
escapeChar :: Char -> String
escapeChar '<' = "<"
escapeChar '>' = ">"
escapeChar ch = [ch][ch]是一个单例列表,它将ch :: Char转换为[ch] :: String。
在Haskell中,可以从/向两边(https://wiki.haskell.org/Eta_conversion)移除/添加一个参数。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 escapeCharescape str = concat (map escapeChar str)发布于 2022-06-10 20:38:24
根据类型,转义是一个接受字符串的函数。但在函数定义中,它似乎没有收到任何论证。这是怎么回事?
concat . map escape返回一个函数。该函数将接受一个字符串并处理它。
escapeChar和c之间的关系是什么?这种关系是如何建立的?c在escapeChar之后出现有意义吗?
是的,它是函数的第一个(也是唯一)参数。它是一个Char字符,escapeChar函数映射了String上的Char。因此,let子句定义了一个函数escapeChar :: Char -> String,然后在concat . map escape (或者更好的concatMap escape)中使用它。这将将给定String的每个String映射到一个子字符串,然后将这些子字符串连接在一起。
发布于 2022-06-10 20:53:07
map函数有一个签名(a -> b) -> ([a] -> [b]) --这意味着映射函数接受一个函数( escapeChar函数),并返回一个使用该函数( escapeChar函数)转换列表的函数。map escapeChar返回一个函数,该函数使用字符串中每个字符的escapeChar函数来转换字符串。
https://stackoverflow.com/questions/72579566
复制相似问题