.(點)代表什么?例如,它用于sumDigits但我不明白它的作用。
toDigits m = loop m [] where
loop x y | x <= 0 = y
| otherwise = loop (x `div` 10) ((x `mod` 10) : y)
sumDigits = sum . map (sum . toDigits)
uj5u.com熱心網友回復:
Haskell中的函陣列合的.代表。
它允許您鏈接不同的功能。在您的情況下,您可以使用函陣列合,而不是執行呼叫toDigits然后覆寫結果的新函式。sum
sumDigits = sum (map myFunction)
myFunction xs = sum (toDigits xs)
的定義.如下。
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
您已經可以查看有關stackoverflow的一個非常好的示例。
假設您有以下功能:
even :: Int -> Bool not :: Bool -> Bool
myOdd :: Int -> Bool并且您想使用上述兩個定義自己的函式。顯而易見的方法如下:
myOdd :: Int -> Bool myOdd x = not (even x)但這可以使用函陣列合更簡潔地完成:
myOdd :: Int -> Bool myOdd = not . evenmyOdd 函式的行為完全相同,但第二個函式是通過將兩個函式“粘合”在一起而創建的。
uj5u.com熱心網友回復:
點(.)是中綴運算子。它被定義為
(f . g) x = f (g x)
因此,
sumDigits = sum . map (sum . toDigits)
= {- by "eta-expansion" -}
sumDigits xs = (sum . map (sum . toDigits)) xs
= {- by definition of (.) -}
sum ( map (sum . toDigits) xs )
= {- re-writing as list comprehension -}
sum [ (sum . toDigits) x | x <- xs ]
= {- by definition of (.) -}
sum [ sum ( toDigits x ) | x <- xs ]
這應該足夠清楚。
但是在任何情況下,您都應該始終將型別簽名添加到您的頂級定義中。在這里你有
toDigits :: Integral a => a -> [a]
sumDigits :: Integral c => [c] -> c
這些至少為我們提供了部分檔案:toDigits將整數轉換為整數串列,反之亦然sumDigits。他們究竟是如何做到的,這些型別沒有說;但它們確實提供了正在發生的事情的大致輪廓。
uj5u.com熱心網友回復:
(.) :: (b -> c) -> (a -> b) -> a -> cis函陣列合[wiki]:它需要兩個函式f和g,對于一個值,x它將回傳f (g x)。在數學中,這表示為f ° g:它產生一個函式,該函式首先應用g,然后將f應用于g的結果。
因此,在這種特定情況下,它將map (sum . toDigits)在呼叫sum結果之前首先應用。對于映射本身,它會toDigits在應用之前先呼叫串列中的每個專案sum。因此,它將為一個數字串列確定數字之和的總和。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427301.html
標籤:哈斯克尔
