小编Cac*_*tus的帖子

对列表生成函数进行延迟评估?

我现在正在阅读Graham Hutton编写的Haskell编程.

在第40页,提出了玩具素性测试:

factors :: Int -> [Int]
factors n = [x | x <- [1..n], n `mod` x == 0]

prime :: Int -> Bool
prime n = factors n == [1,n]
Run Code Online (Sandbox Code Playgroud)

然后,作者继续解释如何

"确定一个数字不是素数不需要函数素数来产生它的所有因子,因为在惰性求值下False,只要产生一个或多个数字本身以外的任何因子,就会返回结果"

作为来自C和Java的人,我发现这令人震惊.我希望factors调用首先完成,将结果保存在堆栈中并将控制传递给调用函数.但显然这里正在执行一个非常不同的程序:列表理解必须有一个循环,factors并且prime正在检查添加到因子列表中的每个新元素的相等性检查.

这怎么可能?这对于程序的执行顺序是否更难以推理?

haskell lazy-evaluation

26
推荐指数
3
解决办法
1874
查看次数

来自Haskell的Applicative的<*>的词源是什么?

这个名字<*>首先出现在文学或代码中的哪个位置,是否对符号的选择有任何解释?

haskell notation nomenclature applicative

25
推荐指数
2
解决办法
585
查看次数

究竟什么是"延续提示?"

我正在尝试破译文档

call-with-continuation-prompt

适用proc于给定的args,当前延续由提示扩展.提示标记为prompt-tag,必须是default-continuation-prompt-tag(默认)或的结果make-continuation-prompt-tag.结果proccall-with-continuation-prompt调用的结果.

我理解它所说的"适用procarg当前延续的给定s"的部分,然后它就是那里的乱码.

对于延续"延伸"甚至意味着什么,以及"提示"如何"延伸"?

scheme continuations racket delimited-continuations

24
推荐指数
1
解决办法
2057
查看次数

(ML)模块vs(Haskell)类型类

根据Harper(https://existentialtype.wordpress.com/2011/04/16/modules-matter-most/),似乎Type Classes根本没有提供与Modules提供的相同级别的抽象,而我正在拥有很难确切地弄清楚原因.并且在该链接中没有示例,因此我很难看到关键差异.还有其他关于如何在模块和类型类之间进行翻译的论文(http://www.cse.unsw.edu.au/~chak/papers/modules-classes.pdf),但这对于从程序员的角度来看实现(它只是说没有人可以做的事情,另一个人无法模仿).

具体来说,在第一个链接中:

首先,他们坚持认为类型可以完全以一种方式实现类型类.例如,根据类型类的哲学,整数可以以一种方式(通常的顺序)排序,但显然有许多有趣的排序(例如,通过可分性).第二个问题是它们混淆了两个不同的问题:指定类型如何实现类型类,以及指定在类型推断期间何时应该使用这样的规范.

我也不明白.一个类型可以在ML中以多种方式实现类型类?如果不创建新类型,您将如何通过示例按可分性排序整数?在Haskell中,您必须执行诸如使用数据之类的操作,并instance Ord提供替代排序.

第二个,不是两个在Haskell中是截然不同的吗?指定"何时应在类型推断期间使用此类规范"可以通过以下方式完成:

blah :: BlahType b => ...
Run Code Online (Sandbox Code Playgroud)

其中BlahType是在类型推断期间使用的类而不是实现类.然而,"类型如何实现类型类"是使用完成的instance.

有人可以解释链接真正想说的内容吗?我只是不太明白为什么模块比Type Classes更少限制.

haskell ml sml

22
推荐指数
1
解决办法
3290
查看次数

找出Agda程序中未解决的问题

找出造成未解决问题的原因的最佳方法是什么?有没有办法通过扩展所有可解决的周围通配符将所有未解决的元素(以及只有未解决的元素)转换为空洞?

如果没有别的,将未解决的元素更改为一个洞会使关于未解决元的消息消失吗?因为那时我想我可以尝试将每个通配符和每个隐式参数更改为孔,直到消息消失然后找出导致问题的那个...

haskell agda

21
推荐指数
1
解决办法
594
查看次数

为什么derived*to base*之间的转换会因私有继承而失败?

这是我的代码 -

#include<iostream>
using namespace std;

class base
{
public:
    void sid()
    {
    }  
};

class derived : private base
{
public:
    void sid()
    {
    }
};

int main()
{
    base * ptr;
    ptr = new derived; // error: 'base' is an inaccessible base of 'derived'
    ptr->sid();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这给出了编译时错误.

error: 'base' is an inaccessible base of 'derived'
Run Code Online (Sandbox Code Playgroud)

由于编译器将尝试调用基类,sid()为什么我会收到此错误?有人可以解释一下.

c++ private derived base accessible

20
推荐指数
5
解决办法
2万
查看次数

使用本地包

我在本地目录中有一个Elm包(源代码+所有构建工件),我想从另一个Elm包中使用它,而不发布库.所以我的目录设置如下所示:

/
  my-lib/
    elm-package.json
  my-app/
    elm-package.json
Run Code Online (Sandbox Code Playgroud)

首先,跑步 elm-package install在库包的目录中似乎不仅仅是构建包; 据我所知,它没有安装在任何全局目录中.

我已经添加my-libmy-app/elm-package.json为这样的:

"dependencies": {
    "elm-lang/core": "1.0.0 <= v < 2.0.0",
    "my-vendor/my-lib": "0.0.1 <= v <= 0.0.1"
}
Run Code Online (Sandbox Code Playgroud)

所以当我elm-make在依赖包的目录中运行时,它会抱怨

my-vendor/my-lib您的计算机上没有包的版本.

elm-package install 抱怨同样的事情.

我发现的唯一解决方法是在以下位置创建以下符号链接my-app:

/
  my-app/
    elm-stuff/
      packages/
        my-vendor/
          my-lib/
            0.0.1@ -> /my-lib/
      build-artifacts/
        my-vendor@ -> /my-lib/build-artifacts/my-vendor
Run Code Online (Sandbox Code Playgroud)

我还必须添加以下内容/my-app/elm-stuff/exact-dependencies.json:

"my-vendor/elm-lib": "0.0.1"
Run Code Online (Sandbox Code Playgroud)

显然,上述所有的应采取的自动照顾elm-package,只要我能在这点/my-lib//my-app/.那我该怎么做?

elm

20
推荐指数
3
解决办法
3659
查看次数

HOAS的复制机翻译

在关于DSL的无标记最终解释器的这些非常酷的注释的第2.3节中,Oleg Kiselyov展示了如何解决一次解析序列化DSL表达式并多次解释它的问题.

简而言之,他用类型表明了"伪造的一流多态"

newtype Wrapped = Wrapped (? repr. ExpSYM repr ? repr)
fromTree :: String ? Either ErrMsg Wrapped
Run Code Online (Sandbox Code Playgroud)

不令人满意,因为它是不可扩展的:我们必须有不同的Wrapper/ fromTree为每个上的约束repr.因此,我倾向于使用他的复制器解释器的解决方案.这个问题是关于如何使用HOAS的解释器.

具体来说,请考虑以下语言进行目标语言绑定:

class Lam repr where
  lam :: (repr a -> repr b) -> repr (a -> b)
  app :: repr (a -> b) -> repr a -> repr b
Run Code Online (Sandbox Code Playgroud)

我在为复制器解释器提供类的声音实例时遇到了麻烦Lam.这就是我所拥有的:

data Dup repr1 repr2 a = Dup {unDupA :: …
Run Code Online (Sandbox Code Playgroud)

dsl haskell ghc

19
推荐指数
1
解决办法
304
查看次数

Haskell模式匹配 - 如何使用常量变量

我最好写这样的东西:

myValue1 = 1 :: Int
myValue2 = 2 :: Int

myFunc :: Int -> Bool
myFunc myValue1 = True
myFunc myValue2 = False

致电myFunc myValue2回报True- 不是我想要的.我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?

haskell pattern-matching

18
推荐指数
4
解决办法
4028
查看次数

@Parcelize在多平台项目中

我想在多平台项目中创建一个类,并用Parcelize它来制作ParcelableAndroid版本.

所以在我的lib-common项目中,我尝试过:

expect annotation class Parcelize()
expect interface Parcelable

@Parcelize
data class Foo(x: Int): Parcelable
Run Code Online (Sandbox Code Playgroud)

在我的lib-android项目中:

actual typealias Parcelize = kotlinx.android.parcel.Parcelize
actual typealias Parcelable = android.os.Parcelable
Run Code Online (Sandbox Code Playgroud)

第一个问题是,摇篮插件kotlin-android-extensions似乎并没有参加lib-androidbuild.gradle,所以包kotlinx.android.parcel没有被发现.我设法通过直接导入库来解决这个问题:

implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)

有了这个,编译的actual定义Parcelable.

但是,我从定义中得到一个错误Foo,好像它没有正确注释@Parcelize:

Foo不是抽象的,也不实现public abstract fun writeToParcel(p0: Parcel!, p1: Int): Unit在中定义的抽象成员android.os.Parcelable

android parcelable kotlin kotlin-android-extensions kotlin-multiplatform

18
推荐指数
2
解决办法
1558
查看次数