Haskell中异常的含义是什么?我看到的唯一用法是放入undefined或error放入我的代码中以阻止程序运行.否则,我认为将异常编程作为逻辑设计缺陷.但是Haskell有一个高级异常模块Control.Exception,它被使用Prelude.我读到C++中异常的原因是为了防止代码中出现很多"调用函数,然后检查状态".但是这些东西可以在Haskell中抽象出来.我可以在Haskell中看到异常处理的另一个原因是使用FFI处理外部异常,但仅限于内部用于包装调用的Haskell函数.
我想知道我应该知道哪些库,函数和概念以及如何使用.Monad和那里的函数是典型的例子,但是在编码中还有其他好的原语,比如Arrows,Applicative,......他们是谁?
顺便说一下,我想在Haskell世界中了解最新情况,学习新概念,这是怎么做到的?
(最初的标题是:"用于编码的库原语",但这已被更改)
似乎Haskell试图成为一种安全的语言,并试图帮助程序员摆脱错误.例如,如果在外面,pred/ succ抛出错误,并且div 1 0还抛出.这些安全的Haskell计算是什么,它们会导致什么开销?
是否有可能为GHC关闭这种安全性,因为在无错误的程序中它们不是必需的?这会导致更好的速度性能吗?
对于C后端,有一个选项-ffast-math.LLVM后端或LLVM是否有任何此类性能选项?
我希望OpenGL ES 2.0中的顶点数组对象保存来自不同缓冲区的两个属性,第二个缓冲区从客户端内存中读取(glBindBuffer(GL_ARRAY_BUFFER, 0))但是我得到一个运行时错误:
GLuint my_vao;
GLuint my_buffer_attrib0;
GLfloat attrib0_data[] = { 0, 0, 0, 0 };
GLfloat attrib1_data[] = { 1, 1, 1, 1 };
void init()
{
// setup vao
glGenVertexArraysOES(1, &my_vao);
glBindVertexArrayOES(my_vao);
// setup attrib0 as a vbo
glGenBuffers( 1, &my_buffer_attrib0 );
glBindBuffer(GL_ARRAY_BUFFER, my_buffer_attrib0);
glBufferData( GL_ARRAY_BUFFER, sizeof(attrib0_data), attrib0_data, GL_STATIC_DRAW );
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray( 0 );
glEnableVertexAttribArray( 1 );
// "end" vao
glBindVertexArrayOES( 0 );
}
void draw()
{
glBindVertexArrayOES(my_vao);
// (now …Run Code Online (Sandbox Code Playgroud) 我经常在元组中收集多个值,因为我认为元组是这种元素的自然类型.但是,元组并不严格.考虑一下
data A
data B =
B !A
data C =
C !(B, B)
data D =
D !B !B
Run Code Online (Sandbox Code Playgroud)
使用-funbox-strict-fields和优化,UNPACK是嵌套的.将在元组C被解压到C A A与D,或只C B B?以下是GHC-doc中的参考:7.16.实用主义.
(是非空元组类型?类型构造函数?)
我想从iOS中的文件加载4通道纹理数据,因此我将纹理视为(连续)地图
[0,1]x[0,1] -> [0,1]x[0,1]x[0,1]x[0,1]
Run Code Online (Sandbox Code Playgroud)
如果我使用fileformat .png,XCode/iOS 会将文件视为图像,因此将每个组件rgb与a(预乘alpha)相乘,从而破坏我的数据.我该怎么解决这个问题?例子可能是
rgb(3通道)其中,我认为最好的解决方案是使用其他文件格式.GL压缩文件格式(PVRTC?)不是Apple平台独立的,似乎是低分辨率(4位)(参考).
编辑:如果我自己的答案是真的,那么就无法在iOS中获得png的4通道数据.由于OpenGL是关于创建图像而不是呈现图像,因此应该可以以某种方式加载4通道数据.png是图像的文件格式(和压缩取决于所有4个通道但是一个通道的压缩与其他通道无关),因此有人可能会说我应该使用另一种文件格式.那么我应该使用哪种其他压缩文件格式,哪些易于在iOS中阅读/集成?
更新:"组合"提到了一种加载4通道非预乘纹理的方法,所以我不得不给他正确的答案.但是,该解决方案有一些我不喜欢的限制.我的下一个问题是"从iOS中的png文件访问原始4通道数据":)
我认为这是一个糟糕的库设计,无法读取4通道png数据.我不喜欢系统试图比我自己聪明.
如何将项目特定变量传递到子目录?我想知道是否有"官方"方式这样做:
# (CMAKE_BUILD_TYPE is one of None, Debug, Release, RelWithDebInfo)
# ...
# set specific build type for 'my_library'
set( CMAKE_BUILD_TYPE_COPY "${CMAKE_BUILD_TYPE}" )
set( CMAKE_BUILD_TYPE "Release" )
add_subdirectory( "my_library" )
set( CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE_COPY} )
# continue with original build type
# ...
Run Code Online (Sandbox Code Playgroud)
库/子目录my_library应始终为buildt类型"Release",主项目和其他子目录应该是buildt,其类型由配置定义.我不能修改CMakeLists.txt的my_library.
我的cmake项目应该编译c ++ 14代码.它还使用其外部库(在我的项目中是git子模块)中包含的CMakeLists.txts.在macOS Sierra(cmake 3.6.2)上构建失败,因为clang的默认STL是旧的并且不处理c ++ 11.据我所知,clang附带了两个STL:libstdc ++(来自gcc)(默认)或libc ++.因此,如果我将-stdlib=libc++选项添加到cmake,则源编译:
add_compile_options( "$<$<COMPILE_LANGUAGE:CXX>:-std=c++14>" )
add_compile_options( "$<$<COMPILE_LANGUAGE:CXX>:-stdlib=libc++>" )
Run Code Online (Sandbox Code Playgroud)
但是它在链接时失败了,因为它试图使用libstdc ++进行链接.如何在cmake中指定新的STL libc ++将用于整个构建过程?
PS:如果它太旧了,默认使用gcc STL的原因是什么?我可以永久地指定它应该使用哪个STL吗?或者我做了一些完全错误的事情(我的一些子项目可以默默地强制gcc吗?)?