Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 函数式编程:在AST中嵌入函数?_Function_F#_Functional Programming_Abstract Syntax Tree - Fatal编程技术网

Function 函数式编程:在AST中嵌入函数?

Function 函数式编程:在AST中嵌入函数?,function,f#,functional-programming,abstract-syntax-tree,Function,F#,Functional Programming,Abstract Syntax Tree,我目前正尝试使用F#来建模将函数链接在一起作为AST的一部分(尽管目前它更像是一个链)。每个链接都是一个函数,也可能有一条链连接到它。但是,要指定附加到链接的链的类型签名,还必须添加更多类型参数。但是你这样做了,然后又添加了一个参数,等等,无限。下面是一个例子 type Chain<'a, 'b, 'c> = | Link of ('a -> 'b) * Chain<'c> // This doesn't work - you need more type par

我目前正尝试使用F#来建模将函数链接在一起作为AST的一部分(尽管目前它更像是一个链)。每个链接都是一个函数,也可能有一条链连接到它。但是,要指定附加到链接的链的类型签名,还必须添加更多类型参数。但是你这样做了,然后又添加了一个参数,等等,无限。下面是一个例子

type Chain<'a, 'b, 'c> =
| Link of ('a -> 'b) * Chain<'c>  // This doesn't work - you need more type params supplied
| End  of 'a

键入Chain'b)*Chain虽然这个问题有点不清楚,但我认为您要求的更像(假设语法):


根本不清楚你想做什么,什么阻止你去做。请试着澄清这个问题。谢谢,存在主义类型确实是我想要的,大致上。然而,我不太熟悉数学符号或“泛型通用类型量化的双重概念”。我可以要求澄清这些观点吗?所谓通用类型量化,我指的是所有量词;在混合数学/F#表示法中,这类似于
∀'x、 F
适用于所有类型的
'x
;在F#中,这实际上是泛型函数或方法提供给您的。有关对偶性的更多信息,请参阅。
type Chain<'a> =
| Link of ('b -> 'a) * Chain<'b>
| End of 'a
type 'a Chain =
| End of 'a
| Link of SomeLink<'a>
and SomeLink<'a> = abstract Apply : LinkUser<'a,'x> -> 'x
and LinkUser<'a,'x> = abstract Apply : ('b -> 'a) * Chain<'b> -> 'x

let mkLink (f, c) = Link { new SomeLink<_> with member __.Apply(w) = w.Apply(f, c) }

let chain = mkLink (sprintf "%i", End 1)

let rec applyChain<'a> : 'a Chain -> 'a = function
| End a -> a
| Link l -> l.Apply { new LinkUser<_,_> with member __.Apply(f, c) = f (applyChain c) }

applyChain chain // "1"