CMC*_*kai 4 polymorphism haskell types
我发现了这些类型的签名:
x :: a b -> Int
x f = 3
y :: a b c -> Int
y f = 3
z :: a b c d -> Int
z f = 3
> x [1] -- 3
> y (1, 2) -- 3
> z (1, 2, 3) -- 3
Run Code Online (Sandbox Code Playgroud)
基本上:
它们是有效的,但我不确定它们的含义以及它们可以用于什么.
它们似乎与类型构造函数上的多类型概念或多态相关,但是基于类型构造函数接受的许多参数强制执行不变量.
没有进一步的限制,这样的类型是无用的 - 没有什么可以真正用它们做,期望正确传递它们.但这实际上与签名的情况相同a -> Int:如果一无所知a,那么你也无能为力!
但是,与例如一样toInteger :: Integral a => a -> Integer,在参数中添加约束可以让你做一些事情.例如,
import Data.Foldable
import Prelude hiding (foldr)
x' :: (Foldable a, Integral b) => a b -> Integer
x' = foldr ((+) . toInteger) 0
Run Code Online (Sandbox Code Playgroud)
而是更多的往往不是,当你有一种形式的a b ... n o p q,那么a b ... p至少是实例Functor类,往往还Applicative和Monad; 有时Foldable,Traversable或Comonad; 有时a b ... o会Arrow...这些约束允许你对复合类型做很多事情,而不知道你正在处理什么类型的构造函数.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |