我是文学编程概念的新手.我正在阅读Donald Knuth关于这个主题的论文(PDF),并且在最初的引言中,他说:
我们不是想象我们的主要任务是指导计算机做什么,而是让我们集中精力向人类解释我们想要计算机做什么.
他或她[文学编程的实践者]努力实现一个易于理解的程序,因为它的概念是以最适合人类理解的顺序引入的,使用了相互加强的正式和非正式方法的混合.
然后,进一步阅读:
关于程序的一个问题是它的结构关系.一个复杂的软件包括简单的部分和这些部分之间的简单关系; 程序员的任务是以最适合人类理解的顺序陈述那些部分和那些关系 - 而不是以某种严格确定的顺序,如自上而下或自下而上.
(......)
自上而下的编程让您对自己的目标有了强烈的了解,但它会迫使您保持很多计划; 悬念累积起来,因为没有任何东西真正被钉死到最后.编程的优势在于,随着越来越多的子程序的构建,你不断使用越来越强大的铅笔; 但它迫使你推迟整个计划组织直到最后一分钟,所以你可能会漫无目的地挣扎.
因此,WEB语言允许人以"意识流"顺序表达节目.缠绵能够争夺一切成的安排,一个Pascal编译器的需求†.WEB的这一特性也许是它最大的资产;
上面的摘录让我对这个主题感兴趣,所以我调查了一下.在任何搜索引擎提供的结果中都不难看出Haskell和文字编程之间的关系,但我没有看到"最适合人类理解的命令".相反,我会看到一个做得很好的文档,同时保持计算机所需的顺序才能工作.
最后,作为一个个人观点,我不得不说,即使Haskell所做的(也可能是许多其他语言)不是Knuth的文字编程,我仍然喜欢这种关于方法和算法的详尽描述的想法.当评论超出目前的代码时,它有很大的作用.
† WEB和TANGLE是系统的一部分,最初是D. Knuth在他的第一个文化编程概念的实现中使用的.
Monads fmap来自Functor类型类.为什么comonads不需要cofmap在Cofunctor类中定义的方法?
没有方法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)
但它不起作用。
有没有办法直接进行这种转换,还是必须有一些中间转换?
我决定学习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列表将下降到是False在
Output列表中,奇数元素将是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)