首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell函数不相容类型及定义

Haskell函数不相容类型及定义
EN

Stack Overflow用户
提问于 2022-06-10 20:32:43
回答 3查看 139关注 0票数 2

我试图理解这个函数(取自这里)

代码语言:javascript
复制
escape :: String -> String
escape =
  let
    escapeChar c =
      case c of
        '<' -> "&lt;"
        '>' -> "&gt;"
        _ -> [c]
  in
    concat . map escapeChar

我的问题是:

  1. 根据类型,escape是一个接受String的函数。但在函数定义中,它似乎没有收到任何论证。这是怎么回事?
  2. escapeCharc之间的关系是什么?这种关系是如何建立的?cescapeChar之后出现有意义吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-10 21:02:52

如果escapeChar是使用模式匹配的顶级定义,会更容易吗?

代码语言:javascript
复制
escape :: String -> String
escape = concatMap escapeChar

escapeChar :: Char -> String
escapeChar '<' = "&lt;"
escapeChar '>' = "&gt;"
escapeChar ch  = [ch]

[ch]是一个单例列表,它将ch :: Char转换为[ch] :: String

在Haskell中,可以从/向两边(https://wiki.haskell.org/Eta_conversion)移除/添加一个参数。escape是eta的简化形式

代码语言:javascript
复制
escape :: String -> String
escape str = concatMap escapeChar str

就像,如果您想为(+)定义一个同义词,那么您就有了相同的编写方法。我觉得add = (+)是最清晰的,您正在识别这两个函数。双方的论点是相同的,所以我们没有具体说明。

代码语言:javascript
复制
add :: Int -> Int -> Int
add     = (+)
add a   = (+) a
add a   = (a +)
add a b = (+) a b
add a b = a + b

这些是编写escape的等效方法。

代码语言:javascript
复制
escape = concat . map escapeChar
代码语言:javascript
复制
escape str = concat (map escapeChar str)
票数 6
EN

Stack Overflow用户

发布于 2022-06-10 20:38:24

根据类型,转义是一个接受字符串的函数。但在函数定义中,它似乎没有收到任何论证。这是怎么回事?

concat . map escape返回一个函数。该函数将接受一个字符串并处理它。

escapeCharc之间的关系是什么?这种关系是如何建立的?cescapeChar之后出现有意义吗?

是的,它是函数的第一个(也是唯一)参数。它是一个Char字符,escapeChar函数映射了String上的Char。因此,let子句定义了一个函数escapeChar :: Char -> String,然后在concat . map escape (或者更好的concatMap escape)中使用它。这将将给定String的每个String映射到一个子字符串,然后将这些子字符串连接在一起。

票数 4
EN

Stack Overflow用户

发布于 2022-06-10 20:53:07

map函数有一个签名(a -> b) -> ([a] -> [b]) --这意味着映射函数接受一个函数( escapeChar函数),并返回一个使用该函数( escapeChar函数)转换列表的函数。map escapeChar返回一个函数,该函数使用字符串中每个字符的escapeChar函数来转换字符串。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72579566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档