是否有可能构造一个更高阶函数isAssociative,它接受两个参数的另一个函数并确定该函数是否是关联的?
类似的问题,但对于其他属性,如交换性.
如果这是不可能的,有没有办法用任何语言自动化它?如果有我感兴趣的Agda,Coq或Prolog解决方案.
我可以设想一个强力解决方案,它检查每个可能的参数组合,永远不会终止.但在这种情况下,"永不终止"是一种不受欢迎的财产.
haskell halting-problem associativity higher-order-functions commutativity
通过高阶函数可以在无类型lambda演算中编码各种类型.
Examples:
zero = ?fx. x
one = ?fx. fx
two = ?fx. f(fx)
three = ?fx. f(f(fx))
etc
true = ?tf. t
false = ?tf. f
tuple = ?xyb. b x y
null = ?p. p (?xy. false)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何研究已经嵌入其他不太常规的类型.如果有一些定理断言可以嵌入任何类型,那将是很棒的.也许有限制,例如只能嵌入类型*.
如果确实可以表示不太常规的类型,那么看一个例子就太棒了.我特别热衷于看看monad类型成员的样子.
monads haskell functional-programming lambda-calculus untyped-variables
此代码(取自Learn You A Haskell):
main = do putStr "Hey, "
putStr "I'm "
putStrLn "Andy!"
Run Code Online (Sandbox Code Playgroud)
显然是个傻瓜
main = putStr "Hey, " >>=
(\_ -> putStr "I'm " >>=
(\_ -> putStrLn "Andy!"))
Run Code Online (Sandbox Code Playgroud)
其中,正如我所理解的那样可以解释为"为了放入斯特伦"安迪!"我首先要把putStr"我是",为了做到这一点,我首先要把putStr"嘿,";
我不同意这种解释,这很烦人,因为编译器显然不会让我感到困惑.我遇到的问题是,lambdas忽略了他们的论点,在懒惰的评估期间,这种事情是不是应该被识别和短路?
此外,当然,绑定会返回IO操作,当IO操作进入main时,它会被执行.但是什么阻止它打印"嘿,安迪!我是"?我怀疑这是绑定正在做什么.
此外,类型"IO()"的IO操作如何携带足够的信息以允许运行时系统打印"嘿,我是安迪!"?IO()与IO()的不同之处在于打印"Hello World!" 或写入文件?
考虑另一个,来自monad的维基百科页面:
加糖版:
do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Nice to meet you, " ++ name ++ "!")
Run Code Online (Sandbox Code Playgroud)
Desugared版本:
putStrLn "What is your name?" >>=
(\_ ->
getLine >>=
(\name ->
putStrLn ("Nice to meet you, " …Run Code Online (Sandbox Code Playgroud) 背景:我正在调查匿名递归,我正在接受实现前奏的挑战而不使用任何命名的递归只是为了帮助它在我的脑海中完美地存在.我还没到那里,一路上我遇到了一些无关但仍然有趣的东西.
map1 = \f -> \x -> if (tail x) == []
then [f (head x)]
else f (head x) : (map1 f (tail x))
map2 f x = if (tail x) == []
then [f (head x)]
else f (head x) : (map2 f (tail x))
map3 f (x:xs) = if xs == [] then [f x] else f x : (map3 f xs)
map4 f (x:[]) = [f x]
map4 f (x:xs) = f x : map4 f …Run Code Online (Sandbox Code Playgroud) 我正在模拟一个4位微处理器.我需要跟踪寄存器,内存和运行输出(还有一个获取 - 执行周期计数器的奖励点).我已经设法在没有monad的情况下做到了这一点,但是一下子明确地传递那么多东西感觉很乱.函数定义也很混乱,冗长且难以阅读.
我试图用monad做这个,它只是不适合在一起.我尝试将所有单独的状态组件视为单一类型,但这给我留下了产生价值的问题.
State Program () -- Represents the state of the processor after a single iteration of the fetch execute cycle
Run Code Online (Sandbox Code Playgroud)
是唯一有意义的类型.但那时为什么甚至打扰?我尝试通过从我的复合类型中拉出字符串并将其作为值来对其进行分解
State Program' String
Run Code Online (Sandbox Code Playgroud)
除了我需要RUNNING输出这一事实外,它工作得很好.无论我做了什么,我都无法同时保持弦乐和状态.
现在我正在努力解决monad变形金刚问题.似乎我必须将所有不同级别的州分开.但我的脑袋快速爆炸.
StateT Registers (StateT Memory (State Output)) a =
StateT (registers -> (StateT Memory (State Output)) (a,registers))
StateT Registers (StateT Memory (State Output)) a =
StateT (registers -> (Memory -> (Output -> (((a,Registers),Memory),Output))))
Run Code Online (Sandbox Code Playgroud)
我还没有进入FEcycle计数器!
问题:
这是我对维基百科所描述的 Dijkstra算法如何处理下图的解释.
首先它标记到所有相邻节点的最短距离,因此A得到1而C得到7.然后它用当前最短路径选择邻居.这是A.原点被标记为已访问,不会再被考虑.从原点到B到A的最短(也是唯一)路径现在是12.A被标记为已访问.从原点到目的地到B的最短路径是13.B被标记为已访问.从Origin到C到目的地的最短路径是14,但这是前一个到C的最短路径的两倍,即7,所以14被丢弃.目的地现在标记为已访问.
目的地已被标记为已访问,因此算法已完成.这是结果:

所以我误解了描述?维基百科上的描述是错误的吗?或者我偶然发现了一个案例,显示Dijkstra的算法不正确(我非常怀疑)?我注意到选择的路径似乎是以贪婪的方式选择的,但显然这是算法的定义特征之一,但是在这种情况下它似乎给出了错误的结果.
显然,有可能实现Haskell,使其在不改变语言语义的情况下急切地进行评估.如果是这样,那么如何处理无限数据结构?
http://csg.csail.mit.edu/pubs/haskell.html
因此,花费大量时间来创建和销毁暂停的计算(thunk).通常,这些计算非常简单,因此很容易对它们进行评估.Faxen和其他人已经使用静态分析来揭示这种渴望的机会.相反,我们建议在任何地方使用热情,同时使用允许我们恢复的机制,如果我们的计划过于急切的话.
关键是"如果我们的计划过于热切,我们就有机制可以恢复".这些机制是什么?他们如何允许无限的数据结构和懒惰评估的其他方面,我已经被认为是一种急切的语言是不可能的?
我正试图解决平衡括号问题.我不想做连续的IO,宁愿只调用getLine并解析生成的字符串.因此,解决问题的函数将处理两种不同的状态:输入字符串的未消耗部分和括号堆栈.
我想设置一些操作堆栈的函数:
type Stack = String
pop :: Stack -> (Char,Stack)
pop (x:xs) = (x,xs)
push :: Char -> Stack -> ((),Stack)
push a xs = ((),a:xs)
Run Code Online (Sandbox Code Playgroud)
如果我在州monad运营,那就好了,不过我在StateT monad运营
balanced :: StateT Stack (State String) Bool
Run Code Online (Sandbox Code Playgroud)
我知道我被告知不要在堆栈中有重复的monad.我这样做是因为我喜欢它如何简化推送和流行定义.
两个问题:
这是代码的其余部分
next :: String -> (Maybe Char,String)
next "" = (Nothing,[])
next (x:xs) = (Just x,xs)
balanced = do
c <- lift (state next)
case c of
Nothing -> return True
Just c -> if elem c open
then (push …Run Code Online (Sandbox Code Playgroud) (为C标签道歉,我这样做是为了突出显示语法。这更多是一个vim问题。如果有人比我了解的更多,我认为应该删除该标签,请这样做)
说我有这个目录结构:
Directory ~/Code/Test/ containing file1.c file2.c file4.c and Sub
Directory ~/Code/Test/Sub/ containing file3.c
Run Code Online (Sandbox Code Playgroud)
file1.c:
#include <stdio.h>
#include "file2.c"
#include "Sub/file3.c"
void function1();
int main (int argc, char *argv[]) {
function1();
function2();
function3();
return 0;
}
void function1() {
printf("1\n");
}
Run Code Online (Sandbox Code Playgroud)
file2.c:
#include <stdio.h>
void function2();
void function2() {
printf("2\n");
}
Run Code Online (Sandbox Code Playgroud)
子/file3.c:
#include "../file4.c"
void function3();
void function3() {
printf("3\n");
function4();
}
Run Code Online (Sandbox Code Playgroud)
file4.c:
#include <stdio.h>
void function4();
void function4() {
printf("4\n");
}
Run Code Online (Sandbox Code Playgroud)
在这些文件中的任何一个文件中,都应该可以从其他文件中跳转到其使用的功能的定义。因此,例如,file1应该能够跳转到file2,file1应该能够跳转到file3的目录,file3应该能够跳转到file4的目录,这就是关键所在;所有文件都应该能够跳转到printf的定义。我也不必为此将c库实现的标签复制到Test目录中。
我想知道如何才能做到这一点。我真的不喜欢单片标签文件。拥有vim范围的标签文件使我感到恐惧。每个目录的标签文件让我很烦。每个项目的标签文件都是可以接受的。但是我真正想要的是每个源文件的标签文件,然后是一种指定vim应该引用的标签文件的方法。
理想情况下,我希望能够对任何内容进行ctrl-]处理,并使vim根据范围内的内容跳转到正确的定义,就像Visual Studio一样。我开始怀疑这是不可能完成的,而且如果这样做(通过插件的某种组合)会非常慢,这确实很烦人,因为我完全同意“ Vim可以完成您新奇的IDE可以做的任何事情在那里呆了几个星期。是的,它绝对是我遇到过的最强大的文本编辑器,但作为IDE,它却极其粗糙。当我使用“转到定义”命令时,无论它是局部变量,在其他文件中,在标准库等中,我都希望获得正确的定义。到目前为止,Vim给了我滑稽的结果,例如从java文件转换为ac文件。而且您必须使用单独的命令来跳转到局部变量的定义...什么?(如果有这个原因,我很想知道)
我知道 …
我不能让这个例子起作用
{ $_ + $_ }, { $_ + 1}, {$_ - 1} | % { $_ 1 }
Run Code Online (Sandbox Code Playgroud)
我希望它构造一个列表/数组/集合/任何函数(这部分很好),然后将该列表传递给右边的代码块,它将每个函数应用于参数1并返回一个数组结果(即; 2,2,0).我已经尝试过使用getnewclosure()方法,&运算符,到目前为止没有任何工作.
powershell closures functional-programming higher-order-functions