小编Mas*_*tic的帖子

GHC类型错误,我不明白

我正在教自己Haskell.

我想编写一个递归查找第一个数字的函数,该数字具有整数平方根并且小于起始数.

它看起来像这样:

findFirstSquare :: Int -> Int
findFirstSquare x
    | x <= 0                                  = error "This function only works for 1 or above"
    | fromInteger(floor(sqrt(x))) == (sqrt x) = x
    | otherwise                               = intSqrt(x - 1)
Run Code Online (Sandbox Code Playgroud)

但GHC抱怨说:

(RealFrac Int)没有因使用'floor'而产生的实例......

但是,如果我在GHCi中键入以下内容,它会愉快地编译它:

 fromInteger(floor(sqrt(4))) == (sqrt 4)
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我从GHCi中成功编译的表达式中得到类型错误?

haskell ghc

4
推荐指数
1
解决办法
617
查看次数

当共享值超出范围时,如何处置/释放/"完成"非托管资源

我有一个类型封装外部资源的键.一旦密钥丢失(共享它的所有值都超出范围),资源应该(隐式地)在下一个垃圾收集中释放,就像内存对常规值一样.

所以我正在寻找类似于OOP处理的东西,或者ForeignPtr,我只代表对外语对象的引用(尽管如果ForeignPtr能够正确和优雅地为此工作,知道如何也回答这个问题).

可能吗?如果是这样,怎么样?

garbage-collection haskell dispose finalizer ghc

4
推荐指数
1
解决办法
176
查看次数

如何使用类型级别的可选字段表示数据?

我正在研究控制流的数据,它有一个值(多态,可以是其他),它也可以有一个验证器函数来检查值是否仍然很好,并且可以有一个"刷新值"的函数(返回带有新值的新数据).

在vanilla Haskell中,它看起来像这样:

data MyData a = MyData
  {value :: a
  ,validator :: Maybe (a -> Bool)
  ,refresher :: Maybe (MyData a -> MyData a)}
Run Code Online (Sandbox Code Playgroud)

我真正想要的是这些类型:

data Refreshable = Refreshable | NotRefreshable
data Validatable = Validatable | NotValidatable
MyData (r :: Refreshable) (v :: Validatable)
Run Code Online (Sandbox Code Playgroud)

我已经做到了,但只有Refreshable.我也想这样做,Validatable但我遇到了构造函数的问题.仅仅因为Refreshable我需要有两个构造函数,一个用于可刷新数据,另一个用于不可刷新数据.有了可验证的,我需要有4个构造函数!(用于可刷新和可验证,不可刷新和可验证,可验证和不可刷新,以及不可刷新和不可验证的).想象一下,如果我以后需要另一个可选字段.更糟糕的是:几乎所有的领域都是相同的,除了那些正在改变的领域,因此有太多的重复.


我也尝试用类型类/类型系来修改这种情况.
例如,MyData 'Refreshable 'NotValidatable只是成为Refreshable data => data,我可以实例MyData或只是删除它可以作为一个实例的更具体的数据.

这也是有问题的,因为它们不再是真正的领域; 即我没有验证器就无法获取数据,使用验证器(不是类型级别)将其更改为相同的数据.


这可能是一个XY问题; 我认为一个更简洁的方法是使数据类型,如Refreshable aValidatable a …

haskell

4
推荐指数
1
解决办法
249
查看次数

我对MVVM模式有一些疑问

我的名字是来自西班牙的Jesús,我是一名.NET开发人员,几天前我刚刚发现了这个伟大的网站.

我对MVVM模式有一些疑问,如果你能回答它我会很高兴.
三个月前我开始使用WPF,我已经学会了MVP模式.
MVP非常好,因为您可以很好地构建应用程序.

我开始在各处看到MVVM,但每个人都在用他自己的方法使用这个模式.
每个博主都在他们的WPF博客中讨论MVVM,但每个实现都是截然不同的.

我现在关注在CodePlex上使用MVVM工具包的实现,但我有疑问,我找不到太多信息.

我认为MVVM是MVP的变种.
使用MVP,每个视图都有一个执行视图工作的演示者.
在MVVM中,它是相同的,但只要你可以使用命令.

我也看到如果你需要一个活动,就像MVP一样; 将事件委托给演示者/视图模型,即它不是视图的作业(例如更新UI).

另一方面,View-Model没有View引用,因此我必须更加努力地使用数据绑定.
您必须使用DelegateCommands(与RelayCommands相同,对吧?).

嗯...更多问题......使用具有两个视图/用户控件的相同View模型是否安全?

哦......昨天我在玩MVVM时遇到了问题.
我创建了一个CommandReference用于键绑定的命令,我将此引用分配给了我的按钮的命令属性,嗯,CanExecuted第一次工作但是IsEnabled当它CanExecuted为真时它没有更新属性.我通过将命令直接绑定到按钮而不使用引用来修复它.问题是:为什么有些代码将引用链接到对象以及为什么其他代码直接绑定命令?

我应该学习哪些与MVVM有关的东西?(昨天我看到一些叫做附加行为的东西,但我不知道那是什么).

我正在重写我使用MVP开发的注释应用程序,但现在使用MVVM.我将替换命令的事件(使用DelegateCommand),消除对视图模型的参考意见,我认为这都是因为,我看到MVVM的例子是很像MVP.

好吧,如果你指出我对这种模式的所有误解,我将不胜感激.

谢谢你,将来我会帮助下一个MVVM新手:)

c# wpf design-patterns mvvm

3
推荐指数
1
解决办法
1604
查看次数

执行直到用户代码不起作用

我正在尝试使用OllyDbg的"执行直到用户代码"功能(这对我来说很重要),但它永远不会奏效.

我首先尝试了一个叫做的程序MessageBoxA.当它调用它时,我在调试器中暂停程序并发出OllyDbg执行直到用户代码,但程序仍然暂停并完全冻结.我甚至无法点击MessageBox确定按钮,甚至从OllyDbg继续.当我努力让它继续下去时它就崩溃了.

所以我决定在NASM中编写一个应用程序(完全控制)并在那里尝试.在MessageBoxA弹出,我暂停,直到执行用户代码,我可以按OK按钮这段时间,但一旦我做了OllyDbg的没有暂停程序.该程序刚刚执行,好像什么也没发生.

为什么它不起作用,我该怎么做才能解决它?

OllyDbg 1.10(无插件)
Windows 7旗舰版SP1 64位

更新:
我尝试使用OllyDbg 2.0,但由于某种原因,执行直到用户代码按钮被完全禁用.

windows debugging reverse-engineering ollydbg

3
推荐指数
1
解决办法
2136
查看次数

GHC何时在内部改变不可变的值?

我希望将Haskell用于包含不断变化的重状态的实时应用程序.

当然,状态是不可改变的,因此在每个州的步骤中,我将重新创建一个新的略微改变的状态并丢弃旧状态.在这种情况下,它会变得非常低效,因为我不需要以前的状态.

我经常遇到人们说GHC可以优化那些东西并在内部改变不可变的值,我想确保它会.

可能吗?有没有办法确定GHC是否会通过内部改变价值来优化它?有没有办法强制执行/确保它会?

PS这个优化是否有正式的名称?

optimization haskell real-time immutability ghc

3
推荐指数
1
解决办法
231
查看次数

为什么我必须执行从另一个函数返回的函数?

为什么这不起作用?

( ((lambda () (lambda (x) (funcall #'1+ x)))) 2)
 ; yields Compile-time error: illegal function call
Run Code Online (Sandbox Code Playgroud)

我遇到了这样的情况,后来发现它funcall修复了它,即

(funcall ((lambda () (lambda (x) (funcall #'1+ x)))) 2) ; => 3
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为它似乎第一个应该工作,因为我实际上有一个我正在调用的函数,而不仅仅是一个可能属于任一命名空间的符号(即(type-of ((lambda () #'1+))) ; => FUNCTION).我认为这将是那种喜欢你怎么不需要funcall拉姆达例如,如((lambda (x) x) :HI) ; => :HI.我错过了什么?

common-lisp lisp-2

3
推荐指数
2
解决办法
704
查看次数

如何让自我参照绑定?

我有一个let,我需要一个绑定在身体中引用自己.即我需要这样的事情:

(let ((my-value (make-value :some-data 2784 :next-value my-value)))
  ; ...)
Run Code Online (Sandbox Code Playgroud)

这会失败,因为my-value定义是未绑定的.我想我可以用它setf来分配值,但对我来说这不是一个好的通用解决方案(例如因为副作用).

我该如何处理这种情况?也许有办法进行前瞻性声明?

common-lisp

3
推荐指数
1
解决办法
110
查看次数

在 Windows 上为 Haskell (GHC) 安装 SDL

背景:

我一直在使用gloss 库进行一些简单的图表工作。但是当需要一些更具交互性的东西时,我发现我想要一个更强大的库。在做了一些研究之后,我决定我喜欢 SDL 库的功能,并想尝试为它安装 Haskell 绑定。到这一步我已经失败了。

第1部分:

如何安装和配置 SDL 二进制文件,以便 Haskell 绑定可以使用它们?

第2部分:

Hackage 上众多且记录不完整的 SDL 包中的哪一个是当前社区中的首选绑定?如何让该软件包正确安装?

第 3 部分:(可选)

如果 SDL 不适合 Haskell 开发,那么首选的替代方案是什么?

haskell sdl cabal

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

我可以通过它的值在函数名称空间中定义一个函数吗?

我最近开始学习CL,我试图找出是否可以在函数名称空间中为符号设置值.

我想根据函数组合定义函数,或者只是通过现有函数定义函数(例如,我只需要identity在玩具"Hello,World!"级项目中重写两次).我不确定它是否可能,因为它可能会破坏命名空间分离(至少没有强制执行).我也尝试过实际做的macroexpand事情defun; 作为一个初学者,它对我来说太神秘了,但似乎内置的核心部分(我正在使用SBCL).

所以,例如,而不是说:

(defun myfn (x) x)
Run Code Online (Sandbox Code Playgroud)

我宁愿说:

(def..? myfn identity)
Run Code Online (Sandbox Code Playgroud)

如果我不能这样做,我怎么能避免这类代码重复?(包括由函数组合创建的函数,而不仅仅是创建同义词).

common-lisp

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