Haskell 函数不兼容的类型和定义

标签 haskell

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

escape :: String -> String
escape =
  let
    escapeChar c =
      case c of
        '<' -> "&lt;"
        '>' -> "&gt;"
        _ -> [c]
  in
    concat . map escapeChar

我的问题是:

  1. 根据类型,escape 是一个接受String 的函数。但似乎在功能定义中它没有收到任何参数。这是如何运作的?
  2. escapeCharc 有什么关系?这种关系是如何建立的? c 紧接在 escapeChar 之后是否有意义?

最佳答案

如果 escapeChar 是使用模式匹配的顶级定义,会不会更简单:

escape :: String -> String
escape = concatMap escapeChar

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

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

在 Haskell 中,您可以从每一侧删除/添加一个参数(eta conversion)。 escapeeta 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/

相关文章:

python - 从函数式语言访问 numpy 数组

haskell - 了解 GHC 错误 "Qualified name in binding position"

haskell - 理解 Haskell pure 和 <$> 的问题

haskell - 将 Scheme call/cc 翻译成 Haskell callCC

haskell - 什么是弱头范式?

haskell - Monad 变压器的使用

haskell - 使 Haskell 函数无点

haskell - 从自定义类型创建随机数据

haskell - 为什么 Haskell 的作用域类型变量不允许在模式绑定(bind)中绑定(bind)类型变量?

haskell - Haskell 中的一元 IO 构造只是一种约定吗?