关于这是一个数学问题还是一个问题,我有点犹豫不决,但我怀疑数学家一般不太可能不太了解或关心这个类别,而Haskell程序员可能会这么做.
因此,我们知道Hask或多或少都有产品(当然,我正在使用idealized-Hask).我对它是否有均衡器感兴趣(在这种情况下它将具有所有有限的限制).
直观地看起来并不是这样,因为你不能像套装一样进行分离,因此一般来说,子对象看起来很难构建.但是对于你想要提出的任何特定情况,似乎你可以通过在Set中计算均衡器并计算它来破解它(因为毕竟,每个Haskell类型都是可数的,并且每个可数集都是同形或者是有限类型,也可以是自然类,Haskell都有.所以我看不出我是如何寻找反例的.
现在,阿格达似乎更有前途一点:那里是比较容易形成子对象.显而易见的sigma类型? A (? x ? f x == g x)是均衡器吗?如果细节不起作用,它在道德上是均衡器吗?
应用函子是众所周知的,并且在Haskellers中广受欢迎,因为它们能够在有效的环境中应用函数.
在类别理论术语中,可以证明以下方法Applicative:
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
相当于有一个Functor f操作:
unit :: f ()
(**) :: (f a, f b) -> f (a,b)
Run Code Online (Sandbox Code Playgroud)
这个想法是写pure你只是用给定的值替换()in unit,并写(<*>)你将函数和参数压缩到一个元组,然后在它上面映射一个合适的应用程序函数.
此外,这种对应关系变成了Applicative法律成左右自然monoidal十岁上下的法律unit和(**),所以实际上是一个适用函子也恰恰是一类理论家称之为一个宽松monoidal仿函数(松懈,因为(**)仅仅是一个自然的转变,而不是同构).
好的,很好,很棒.这是众所周知的.但是,这只是一个家庭不严monoidal函子-那些尊重的monoidal结构产品.松散的幺正算子涉及两种幺半群结构的选择,在源头和目的地:如果你把产品变成总和,你就会得到:
class PtS f where
unit :: f Void
(**) :: f a -> f b -> f (Either a b) …Run Code Online (Sandbox Code Playgroud) 我编写了一些需要-XUndecidableInstances来编译的Haskell代码.我确实理解为什么会发生这种情况,因为存在某种违反的条件,因此GHC会大喊大叫.
但是,我从来没有遇到类型检查器实际上挂起或在无限循环中结束的情况.
非终止实例定义是什么样的 - 你能给出一个例子吗?
我无法在Haskell中编译这行代码,但它适用于我教授的系统.我使用ghci版本7.6.2.
data Eq a => Shape a = Shape a
Run Code Online (Sandbox Code Playgroud)
更确切地说,这是我得到的错误
[1 of 1] Compiling Main ( test.hs, interpreted )
test.hs:1:6:
Illegal datatype context (use -XDatatypeContexts): Eq a =>
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
这里有什么错误?
谢谢
我正在编写一个作为守护进程运行的程序.要创建守护程序,用户为每个必需的类提供一组实现(其中一个是数据库)所有这些类的函数都具有表单的类型签名StateT s IO a,但s每个类都有所不同.
假设每个类都遵循以下模式:
import Control.Monad (liftM)
import Control.Monad.State (StateT(..), get)
class Hammer h where
driveNail :: StateT h IO ()
data ClawHammer = MkClawHammer Int -- the real implementation is more complex
instance Hammer ClawHammer where
driveNail = return () -- the real implementation is more complex
-- Plus additional classes for wrenches, screwdrivers, etc.
Run Code Online (Sandbox Code Playgroud)
现在我可以定义一条记录,表示用户为每个"槽"选择的实现.
data MultiTool h = MultiTool {
hammer :: h
-- Plus additional fields for wrenches, screwdrivers, etc.
} …Run Code Online (Sandbox Code Playgroud) 当我在keyPress事件处理程序中检查它时,myInput.value是一个键击.因此,如果用户输入"a",myInput.value会给我"".然后,当用户键入"b"时,myInput.value会给我"a",等等.通过触发事件的击键输入的字符似乎不会更新该值.我究竟做错了什么?谢谢 - 摩根
Wadler的论文"免费定理"意义上的"自由定理" 关于某些值的等式是仅基于它们的类型导出的.所以,例如,
f : {A : Set} ? List A ? List A
Run Code Online (Sandbox Code Playgroud)
自动满足
f . map g = map g . f
Run Code Online (Sandbox Code Playgroud)
我可以接受以下类型的Agda术语:
(f : {A : Set} ? List A ? List A) {B C : Set} (g : B ? C) (xs : List B)
? f (map g xs) ? map g (f xs)
Run Code Online (Sandbox Code Playgroud)
或者如果是这样/如果没有,我可以做更多/更少一般的事情吗?
我知道轻量级自由定理库的存在,但我认为它没有做我想要的(或者如果它确实如此,我不能很好地理解它).
(一个示例用例是我有一个仿函数,F : Set ? Set并且想要证明多态函数F A × F B ? F (A × B)自动转换.)
GHC用户指南参考以下示例描述了impredicative polymorphism扩展:
f :: Maybe (forall a. [a] -> [a]) -> Maybe ([Int], [Char])
f (Just g) = Just (g [3], g "hello")
f Nothing = Nothing
Run Code Online (Sandbox Code Playgroud)
但是,当我在文件中定义此示例并尝试调用它时,我收到类型错误:
ghci> f (Just reverse)
<interactive>:8:9:
Couldn't match expected type `forall a. [a] -> [a]'
with actual type `[a0] -> [a0]'
In the first argument of `Just', namely `reverse'
In the first argument of `f', namely `(Just reverse)'
In the expression: f (Just reverse)
ghci> f (Just id)
<interactive>:9:9:
Couldn't match …Run Code Online (Sandbox Code Playgroud) 当我MIN_VERSION_在Haskell项目中使用Cabal的各种宏时,如何在不使用cabal时确保它们都被正确定义,例如在GHCi中进行测试时?
我想通过打印来调试我的程序
例如,
isPos n
| n<0 = False
| otherwise = True
Run Code Online (Sandbox Code Playgroud)
我想要的东西:
isPos n
| n<0 = False AND print ("negative")
| otherwise = True AND print ("positive")
Run Code Online (Sandbox Code Playgroud)
在Haskell可以做到吗?
haskell ×8
agda ×2
ghci ×2
applicative ×1
cabal ×1
debugging ×1
decidable ×1
forms ×1
functor ×1
ghc ×1
javascript ×1
state ×1
typechecking ×1