我試圖理解下面的一段代碼:即使參數丟失,爲什麼此功能仍能正常工作?
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