我有一个看起来像的数据类型
data G f n a where
G :: a -> G f n a -> G f (f n) a
Run Code Online (Sandbox Code Playgroud)
它是一个由自然索引的容器,它采用一种函数来确定如何进行归纳.
我可以很容易地定义类型同义词
type G' n a = G S n a
Run Code Online (Sandbox Code Playgroud)
但我希望能够使用身份功能.
我尝试使用Data.Functor.Identity,但即使用PolyKinds重新定义,我也无法在Naturals(:k Identity => Nat -> Nat)上获得类型级函数,所以我转向类型族,定义
type family Id a where
Id a = a
Run Code Online (Sandbox Code Playgroud)
哪个,很酷,它编译.不幸的是,我提供type G'' n a = G Id n a并且我收到了错误消息
The type family ‘Id’ should have 1 argument, but has been given none
In the type synonym declaration for …Run Code Online (Sandbox Code Playgroud) 在CodeReview的答案中,提问者和回答者似乎都对(++)运算符表示不屑.这是由于它的速度(导致算法明确地在O(n ^ 2)中运行,其中n是列表的长度iirc)?如果不进行其他测试,这是否是预优化,因为Haskell因难以推断时间复杂性而闻名?其他人是否应该避免程序中的(++)运算符?
在玩各种情况的minBound时,我试过了
> minBound :: Int
=> -9223372036854775808
Run Code Online (Sandbox Code Playgroud)
这看似合理.
然而,
> abs minBound :: Int
=> -9223372036854775808
Run Code Online (Sandbox Code Playgroud)
这怎么可能?不应该abs x >= 0,假设x :: Int?
我在这里缺少对语义的某种理解吗?