Bra*_*FRZ 2 haskell types composition
我在玩Haskell中的类型,偶然发现它length . sum是有效的。是否有某种语义上的含义应该允许它起作用,或者这仅仅是类型定义的疣?我已经在下面编写了每个类型定义。
length :: Foldable t => t a -> Int
sum :: (Foldable t, Num a) => t a -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
length . sum :: (Foldable t1, Foldable t2, Num (t1 a)) => t2 (t1 a) -> Int
Run Code Online (Sandbox Code Playgroud)
我能理解的唯一情况是将字符加到一个字符串中,然后就可以得到该字符串的长度。但是,sum只能采用可折叠的数字类型,因此无法使用。
这是一个简单的例子。
import Data.Functor.Identity
xs :: [Identity Int]
xs = map Identity [0..9]
result :: Int
result = length . sum $ xs
main :: IO ()
main = print result -- 1
Run Code Online (Sandbox Code Playgroud)
让我们了解发生了什么。
xs。因此,sum xs是Identity 0 + ... + Identity 9其评估对Identity 45。请注意,这Num a => Identity a是的实例Num。sum xs。因此,length . sum $ xs之所以length $ Identity 45求值是1因为在任何Identity数据结构中都只有一个元素。如果您查看的签名,这将很有意义length . sum。
import Data.Functor.Identity
xs :: [Identity Int]
xs = map Identity [0..9]
result :: Int
result = length . sum $ xs
main :: IO ()
main = print result -- 1
Run Code Online (Sandbox Code Playgroud)
首先,我们遍历g并找到sum所有的f a范围内g。的定义sum取决于类型f a。结果是f a。然后,我们找到length的结果f a。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |