小编Fut*_*iti的帖子

“重载签名与单态限制冲突”

为什么允许这样做:

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)

haskell monomorphism-restriction

9
推荐指数
1
解决办法
169
查看次数

Haskell 中的任何部分函数都可以转换为完整版本吗?

到目前为止,我已经看到了某些部分函数的许多“可能”版本,这些函数可能会导致 \xe2\x8a\xa5,例如readMaybeforreadlistToMaybefor head; 有时我想知道我们是否可以概括这个想法并制定这样一个函数,safe :: (a -> b) -> (a -> Maybe b)将任何部分函数转换为更安全的完整替代方案,该替代方案Nothing在原始函数中调用错误堆栈的任何实例上返回。到目前为止,我还没有找到实现此类safe功能的方法或类似类型的现有实现,我开始怀疑这个想法是否真正可行。

\n

haskell partial-functions

6
推荐指数
2
解决办法
268
查看次数

结合约束条件?

我正在寻找一种方法来组合两个(或多个)约束,这样就Combine c1 c2 a意味着c1 ac2 a,反之亦然。当约束用作输入时,这可能很有用:

data HList constraint where
  Empty :: HList constraint
  (:*:) :: constraint a => a -> HList constraint -> HList constraint
Run Code Online (Sandbox Code Playgroud)

其中shownegate可以应用于 hlist 类型的元素HList (Combine Show Num)

有了这些要求,type Combine c1 c2 a = (c1 a, c2 a)就不行了,因为类型同义词必须饱和。我也尝试声明Combine为一个类,但不能暗示这一点(Combine c1 c2 a) => c1 ac2 a

class (c1 a, c2 a) => Combine c1 c2 a
instance …
Run Code Online (Sandbox Code Playgroud)

haskell constraints combinators

2
推荐指数
1
解决办法
71
查看次数