我在理解這個例子時遇到了一些麻煩:
data Row = R [Int]
deriving Show
data Matrix = M [Row]
deriving Show
check :: Matrix -> Int -> Bool
check (M matrix) n = foldr ((&&) . (\(R row) -> length row == n)) True matrix
test1 = check (M[R[1,2,3], R[4,5], R[2,3,6,8], R[8,5,3]]) 3 == False
我有這個Row包含整數串列的Matrix資料型別,以及包含行串列的資料型別。如果所有行的長度都等于第二個引數,我必須檢查我的函式n。我真的不明白為什么會這樣foldr。讓我們看看test1。它開始做 ((&&) . (lambda)) R[8, 5, 3] True
Is not now, some sort of (fg) xy which is f (gxy) ?如果是這樣,結果將是&&(lambda R[8, 5, 3] True)<-> && (True True),并且括號中的運算式不是首先評估的 ( True True) 并且應該給我一個錯誤嗎?請讓我了解執行順序是什么以及我錯在哪里。
uj5u.com熱心網友回復:
首先,讓我們記住是做什么foldr的:它接受一個函式f、一個串列xn = [x1, x2, ..., xn]和一個起始值s并生成運算式
f x1 (f x2 (... (f xn s) ...))
或等效地
f x1 $ f x2 $ ... $ f xn $ s
函陣列合(.)首先應用右側函式,然后是左側函式,所以首先是你的 lambda 運算式,我們checkRow現在不時呼叫它(&&)。這導致
(&&) (checkRow x1) $ (&&) (checkRow x2) $ ... $ (&&) (checkRow xn) $ True
插入時True作為您的起始值。
這可以用中綴表示法重寫為
(checkRow x1) && (checkRow x2) && ... (checkRow xn) && True
編輯:關于在這種情況下函陣列合如何作業,請查看型別:
(.) :: (b -> c) -> (a -> b) -> a -> c
請記住,(&&)可以將其視為回傳另一個(在本例中為一元)函式并遵循型別的一元函式:
(Bool -> (Bool -> Bool)) -> (Row -> Bool) -> Row -> Bool -> Bool
(&&) . checkRow :: Row -> Bool -> Bool
所以 and 的組合(&&)是checkRow一個接受 aRow和 aBool并回傳 a的函式Bool。因此右側函式應用于第一個輸入引數,結果作為第二個函式的第一個輸入引數轉發。然而,第二個函式可以接受多個引數。
這與 的型別很好地對齊foldr:
foldr :: (a -> b -> b) -> b -> [a] -> b
或者在你的情況下
(Row -> Bool -> Bool) -> Bool -> [Row] -> Bool
uj5u.com熱心網友回復:
您的問題似乎與了解折疊中使用的函式的實際作用有關:
(&&) . (\(R row) -> length row == n)
確實,它有點神秘。讓我們嘗試以等效的形式重寫它。根據組合的定義,a.b意味著\x -> a (b x),因此我們得到
\x -> (&&) ( (\(R row) -> length row == n) x )
這看起來仍然很奇怪,因為我們想&&應用于兩個引數。我們可以 eta-expand:f等價于\y -> f y. 我們得到
\x -> \y -> (&&) ( (\(R row) -> length row == n) x ) y
意思是
\x y -> ( (\(R row) -> length row == n) x ) && y
注意型別: here x :: Row, while y :: Bool。我們可以等效地將上面的內容重寫為
\(R row) y -> length row == n && y
這意味著折疊
foldr ((&&) . (\(R row) -> length row == n)) True [Row r1, Row r2, ...]
簡化為
length r1 == n && (length r2 == n && ... (... && True))
這相當于檢查所有行是否具有相同的長度n。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/417814.html
標籤:
上一篇:創建類haskell的實體
