我试图理解下面的一段代码:即使参数丢失,为什么此功能仍能正常工作?
import Data.Char (ord)
encodeInteger :: String -> Integer
encodeInteger = read . concatMap ch
where ch c = show (ord c)
但我不明白如何当encodeInteger
被定义为需要一个字符串的函数这可以工作,但在第二行中,函数实现时没有该字符串参数。
此外,concatMap
(根据hoogle)采用函数和列表,但仅提供功能ch
。
为什么此代码仍然有效?这个论证是不是神奇地通过了?它与咖喱有关吗?
编辑:为什么不就努力改变这样的:
encodeInteger :: String -> Integer
encodeInteger a = read . concatMap ch a
where ch c = show (ord c)
函数'甲 - >乙 - >在Haskell C'表示功能'一个 - >(B - > C)',即,如果施加到一个'A'它产生一个'乙 - > C'。 'f a b'同样只是'(f a)b'。如此以来,'concatMap'是(简化的)'(一 - >并[b]) - >并[a] - >并[b]','concatMap ch'是一个函数'[A] - >并[b]'。 – Ryan
嗨,谢谢,这无论如何都是有道理的。但是,我不应该做我在编辑下添加的内容吗? – user66875
@ user66875您需要将整个构图应用于参数。现在,期待'concatMap ch a'成为一个函数('.'的第二个参数)。使用'阅读。 concatMap ch $ a' – Lazersmoke