为什么允许这样做:
i :: Num a => a
i = 1
Run Code Online (Sandbox Code Playgroud)
虽然这些都是不允许的:
i' :: Num a => a
Just i' = Just 1
x, y :: Num a => a
(x, y) = (1, 2)
x :: Num a => a
y :: Num a => a
(x, y) = (1, 2)
y :: Num a => a
x :: Num a => a
(x, y) = (1, 2)
m :: ()
n :: Num a => a
(n, m) = …Run Code Online (Sandbox Code Playgroud) 到目前为止,我已经看到了某些部分函数的许多“可能”版本,这些函数可能会导致 \xe2\x8a\xa5,例如readMaybeforread和listToMaybefor head; 有时我想知道我们是否可以概括这个想法并制定这样一个函数,safe :: (a -> b) -> (a -> Maybe b)将任何部分函数转换为更安全的完整替代方案,该替代方案Nothing在原始函数中调用错误堆栈的任何实例上返回。到目前为止,我还没有找到实现此类safe功能的方法或类似类型的现有实现,我开始怀疑这个想法是否真正可行。
我正在寻找一种方法来组合两个(或多个)约束,这样就Combine c1 c2 a意味着c1 a和c2 a,反之亦然。当约束用作输入时,这可能很有用:
data HList constraint where
Empty :: HList constraint
(:*:) :: constraint a => a -> HList constraint -> HList constraint
Run Code Online (Sandbox Code Playgroud)
其中show和negate可以应用于 hlist 类型的元素HList (Combine Show Num)。
有了这些要求,type Combine c1 c2 a = (c1 a, c2 a)就不行了,因为类型同义词必须饱和。我也尝试声明Combine为一个类,但不能暗示这一点(Combine c1 c2 a) => c1 a或c2 a:
class (c1 a, c2 a) => Combine c1 c2 a
instance …Run Code Online (Sandbox Code Playgroud)