簡體   English   中英

Haskell函數組成問題

[英]Haskell function composition question

如果這樣做:

Prelude Data.Char> map toUpper ("sdfsd" ++ "dfgfdg")
"SDFSDDFGFDG"

那為什么不這樣呢?

Prelude Data.Char> map toUpper . (++) "sdfsd" "dfgfdg"

<interactive>:1:14:
    Couldn't match expected type `a -> [Char]'
           against inferred type `[Char]'
    In the second argument of `(.)', namely `(++) "sdfsd" "dfgfdg"'
    In the expression: map toUpper . (++) "sdfsd" "dfgfdg"
    In the definition of `it': it = map toUpper . (++) "sdfsd" "dfgfdg"
map toUpper . (++) "sdfsd" "dfgfdg"

被解析為:

(map toUpper) . ((++) "sdfsd" "dfgfdg")

所以基本上你在做

(map toUpper) . "sdfsddfgfdg"

這不起作用,因為第二個參數. 需要是一個函數,而不是一個字符串。

我假設你正在嘗試做更多的事情(map toUpper . (++)) "sdfsd" "dfgfdg" 這也行不通,因為++的返回類型是[a] -> [a]map toUpper的參數類型是[a]

這里的事情是,雖然有人可能認為++是一個帶有兩個列表並返回一個列表的函數,但它實際上是一個函數,它接受一個列表,然后返回一個函數,該函數接受另一個列表並返回一個列表。 為了得到你想要的東西,你需要把++變成一個帶有兩個列表的元組並返回一個列表的函數。 那被稱為uncurrying。 以下作品:

map toUpper . (uncurry (++)) $ ("sdfsd", "dfgfdg")

你想要$而不是. map toUpper $ (++) "sdfsd" "dfg"工作並做你想要的。 原因是$是一個非常低優先級的函數應用程序,因此更正后的版本讀作:“將函數map toUpper應用於(++) "sdfsd" "dfg" ”的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM