【发布时间】:2022-01-26 03:00:29
【问题描述】:
Haskell Noob 在这里。
我在这里尝试做的一个过于简单的案例:
test :: Int -> a
test i = i -- Couldn't match expected type ‘a’ with actual type ‘Int’. ‘a’ is a rigid type variable bound by ...
我不太明白为什么这不起作用。我的意思是,Int 肯定包含在 a 类型的东西中。
我真正想要实现的是:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
data EnumType = Enum1 | Enum2 | Enum3
data MyType (a :: EnumType) where
Type1 :: Int -> MyType 'Enum1
Type2 :: String -> MyType 'Enum2
Type3 :: Bool -> MyType 'Enum3
myFunc :: EnumType -> MyType 'Enum1 -> MyType any
myFunc Enum1 t = t -- Can't match type `any` with `Enum1`. any is a rigid type variable bound by ...
myFunc Enum2 _ = Type2 "hi"
myFunc Enum3 _ = Type3 True
这里发生了什么?有没有办法解决这个问题,或者它只是你不能做的事情?
【问题讨论】:
-
您的函数承诺对于 any
a,它可以将Int转换为a,因此如果您确定a是 @987654330 @,那么您的函数应该仍然能够将Int转换为Char。 -
这与 Java 不同,例如,
object的返回类型承诺输出将是对象的子类。但是在哪里无法通过调用函数来决定该对象将是什么。 -
您可能会喜欢我对Why can a Num act like a Fractional? 的回答。简而言之:它是
test的调用者,而不是实现者,可以选择将a专门化为什么单态值;他们可能会选择不是Int。
标签: haskell