我試圖了解元組在 Haskell 中是如何作業的。
我遇到了這種型別的建構式leftRight :: (Either a b -> c) -> (a -> c, b -> c),我正在努力看看它做了什么。
所以我們有(Either a b -> c)這意味著要么將a應用于c,要么將b應用于c。但是輸出是一個元組?這是否意味著它拆分了函式,以便元組的左側接受在 a 給出的引數,而右側接受在右邊給出的引數?這在代碼中看起來如何?
uj5u.com熱心網友回復:
“我遇到了這種型別的建構式……”
它不是型別建構式 - 它是函式型別宣告。
->分隔出引數型別。最后一個是回傳型別,前一個是輸入型別。
因此leftRight :: (Either a b -> c) -> (a -> c, b -> c)接受一個輸入并回傳一個輸出。
- 輸入功能:
(Either a b -> c) - 輸出函式對:
(a -> c, b -> c)
括號中包含函式。
第一個函式采用 Either 型別(左邊的值是錯誤型別,,a右邊的值是 OK 型別,'b' - 它幫助我想到拉丁文,左邊是險惡的,右邊是 dexter - 你的里程可能變化)作為輸入并回傳型別的東西c。
第二個函式是兩個獨立函式的元組,一個是a -> c,一個是b -> c。
具體版本:typea是包含我的錯誤訊息的字串,typeb是 Int,typec是另一個字串。
leftRight :: (Either String Int -> String) -> (String -> String, Int -> String)
uj5u.com熱心網友回復:
所以我們有
Either a b -> c這意味著要么a應用于c或b應用于c
錯了,或者至少措辭不好。這里沒有“適用c”。
它的實際意思是:該函式可以接受一個a-value 或一個b-value,并且在任何一種情況下都會產生一個c-value。
這相當于同時擁有一個只接受a-values 并給出c-results 的函式,以及一個只接受-valuesb并給出 -results 的函式c。元組將這兩個函陣列合在一起。
看一個例子來說明可能會有所幫助:
fryPancake :: Either Butter Margarine -> Pancake
[假設我們已經處理過面糊中的面粉、雞蛋等]
從這里你可以同時獲得
fryPancakeWithButter :: Butter -> Pancake
fryPancakeWithButter b = fryPancake (Left b)
fryPancakeWithMargarine :: Margarine -> Pancake
fryPancakeWithMargarine m = fryPancake (Right m)
現在您只需將這兩個組合在一起:
fryPancake' :: (Butter -> Pancake, Margarine -> Pancake)
fryPancake' = (fryPancakeWithButter, fryPancakeWithMargarine)
...這與
fryPancake' = leftRight fryPancake
uj5u.com熱心網友回復:
to 的輸入leftRight是一個函式,輸出是兩個函式。元組幾乎沒有相關性,除了它將兩個函陣列合成一個輸出,因此leftRight可以一次回傳它們。
一個函式的型別是a -> c,另一個函式的型別是b -> c。大概是第一個函式包裝了ainLeft然后呼叫原函式,第二個函式包裝了binRight然后呼叫了原函式:
leftRight :: (Either a b -> c) -> (a -> c, b -> c)
leftRight original = (leftFunc, rightFunc)
where
leftFunc aVal = original (Left aVal)
rightFunc bVal = original (Right bVal)
uj5u.com熱心網友回復:
關鍵是使用函陣列合。型別函式a -> c可以從型別函式a -> Either a b和中創建Either a b -> c。你有Left :: a -> Either a b并且你有引數f :: Either a b -> c傳遞給leftRight.
b -> c相同的引數使您可以類似地構造型別的函式。這給你
leftRight :: (Either a b -> c) -> (a -> c, b -> c)
leftRight f = let g1 = ...
g2 = ...
in (g1, g2)
我將g1和的定義g2留作練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517121.html
標籤:哈斯克尔
上一篇:Network.Socket示例中的`withFdSocketsocksetCloseOnExecIfNeeded`呼叫的目的是什么?
