小编J. *_*bal的帖子

Haskell中的文字编程真的是"文化编程"吗?

我是文学编程概念的新手.我正在阅读Donald Knuth关于这个主题的论文(PDF),并且在最初的引言中,他说:

我们不是想象我们的主要任务是指导计算机做什么,而是让我们集中精力向人类解释我们想要计算机做什么.

他或她[文学编程的实践者]努力实现一个易于理解的程序,因为它的概念是以最适合人类理解的顺序引入的,使用了相互加强的正式和非正式方法的混合.

然后,进一步阅读:

关于程序的一个问题是它的结构关系.一个复杂的软件包括简单的部分和这些部分之间的简单关系; 程序员的任务是以最适合人类理解的顺序陈述那些部分和那些关系 - 而不是以某种严格确定的顺序,如自上而下或自下而上.

(......)

自上而下的编程让您对自己的目标有了强烈的了解,但它会迫使您保持很多计划; 悬念累积起来,因为没有任何东西真正被钉死到最后.编程的优势在于,随着越来越多的子程序的构建,你不断使用越来越强大的铅笔; 但它迫使你推迟整个计划组织直到最后一分钟,所以你可能会漫无目的地挣扎.

因此,WEB语言允许人以"意识流"顺序表达节目.缠绵能够争夺一切成的安排,一个Pascal编译器的需求.WEB的这一特性也许是它最大的资产;

上面的摘录让我对这个主题感兴趣,所以我调查了一下.在任何搜索引擎提供的结果中都不难看出Haskell和文字编程之间的关系,但我没有看到"最适合人类理解的命令".相反,我会看到一个做得很好的文档,同时保持计算机所需的顺序才能工作.

  • 你能否使用术语"文学编程"来消除该订单问题?
  • 有文化编程的其他定义是否需要"意识流"顺序功能?
  • Haskell真的有文化编程能力(使用Knuth的定义)吗?

最后,作为一个个人观点,我不得不说,即使Haskell所做的(也可能是许多其他语言)不是Knuth的文字编程,我仍然喜欢这种关于方法和算法的详尽描述的想法.当评论超出目前的代码时,它有很大的作用.


WEB和TANGLE是系统的一部分,最初是D. Knuth在他的第一个文化编程概念的实现中使用的.

haskell literate-programming

16
推荐指数
1
解决办法
918
查看次数

为什么Haskell中没有`Cofunctor`类型类?

Monads fmap来自Functor类型类.为什么comonads不需要cofmapCofunctor类中定义的方法?

monads haskell functor

13
推荐指数
2
解决办法
1298
查看次数

如何将整数转换为 std::u16string (C++11)?

没有方法std::to_u16string(...)。显然static_cast,这似乎不是进行这种转换的最合适的方法。

对于相反的转换, from stringto int,可以使用函数定义转换器std::stoi(),但是 from inttou16string它不起作用。

我尝试了以下方法:

int i = 1234;
std::u16string s;

std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
s = convert.from_bytes(std::to_string(i));

std::cout << s.str() << "  (" << s.length() << ")" << std::endl;
Run Code Online (Sandbox Code Playgroud)

我也尝试这样做:

typedef std::basic_stringstream<char16_t> u16ss;
u16ss ss;
ss << 1234;
std::u16string s = ss.str();
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

有没有办法直接进行这种转换,还是必须有一些中间转换?

c++ string casting c++11

7
推荐指数
1
解决办法
1551
查看次数

哈斯克尔.跟踪索引以生成新列表

我决定学习Haskell并学习以更实用的方式思考,所以我试图解决非常简单的练习,试图在这个范例中使用一个好的方法.

我想在Haskell中实现这个简单的练习:

Input: [2, 4, 1, 1, 2]
Output: [True, True, False, False, False, False, True, False, True, True]
Run Code Online (Sandbox Code Playgroud)

所以,在元素Input列表将下降到是FalseOutput列表中,奇数元素将是True; 每个重复的次数与Input列表中的值相同.

遍历Input列表,如果  ᵗʰ项目是在一对位置上,附加到输出True Output; 如果  ᵗʰ产品在奇数位置,追加False 倍到Output列表中.

这似乎是一个非常简单的问题,而且确实如此.但对我来说,没有任何函数式编程背景,我不知道如何在Haskell中表达它.

我试图通过在列表理解中使用λ函数来跟踪当前索引.

    row :: [Integer] -> [Bool]
    row xs = [ (last $ zipWith (\i x -> x) [1..] [0..i]) `mod` 2 == 0
                | j <- xs, i <- [0..j-1] …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming list-comprehension list

6
推荐指数
1
解决办法
1697
查看次数