我现在正在阅读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正在检查添加到因子列表中的每个新元素的相等性检查.
这怎么可能?这对于程序的执行顺序是否更难以推理?
这个名字<*>首先出现在文学或代码中的哪个位置,是否对符号的选择有任何解释?
我正在尝试破译文档
call-with-continuation-prompt适用
proc于给定的args,当前延续由提示扩展.提示标记为prompt-tag,必须是default-continuation-prompt-tag(默认)或的结果make-continuation-prompt-tag.结果proc是call-with-continuation-prompt调用的结果.
我理解它所说的"适用proc于arg当前延续的给定s"的部分,然后它就是那里的乱码.
对于延续"延伸"甚至意味着什么,以及"提示"如何"延伸"?
根据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更少限制.
找出造成未解决问题的原因的最佳方法是什么?有没有办法通过扩展所有可解决的周围通配符将所有未解决的元素(以及只有未解决的元素)转换为空洞?
如果没有别的,将未解决的元素更改为一个洞会使关于未解决元的消息消失吗?因为那时我想我可以尝试将每个通配符和每个隐式参数更改为孔,直到消息消失然后找出导致问题的那个...
这是我的代码 -
#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()为什么我会收到此错误?有人可以解释一下.
我在本地目录中有一个Elm包(源代码+所有构建工件),我想从另一个Elm包中使用它,而不发布库.所以我的目录设置如下所示:
/
my-lib/
elm-package.json
my-app/
elm-package.json
Run Code Online (Sandbox Code Playgroud)
首先,跑步 elm-package install在库包的目录中似乎不仅仅是构建包; 据我所知,它没有安装在任何全局目录中.
我已经添加my-lib到my-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/.那我该怎么做?
在关于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) 我最好写这样的东西:
myValue1 = 1 :: Int myValue2 = 2 :: Int myFunc :: Int -> Bool myFunc myValue1 = True myFunc myValue2 = False
致电myFunc myValue2回报True- 不是我想要的.我知道为什么会发生这种情况,但有没有办法在Haskell中表达这一点而不诉诸C风格的#define语句?
我想在多平台项目中创建一个类,并用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-android的build.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
haskell ×6
accessible ×1
agda ×1
android ×1
applicative ×1
base ×1
c++ ×1
derived ×1
dsl ×1
elm ×1
ghc ×1
kotlin ×1
ml ×1
nomenclature ×1
notation ×1
parcelable ×1
private ×1
racket ×1
scheme ×1
sml ×1