Lisp在学术界很早就开发了一套有趣的语言功能,但大多数都没有在生产环境中流行.
有些语言,比如JavaScript,改编了基本功能,如垃圾收集和词法闭包,但所有可能实际上改变你大规模编写程序的东西,比如功能强大的宏,代码作为数据的东西和自定义控件结构,似乎在其他功能语言中传播,其中任何一种都不适用于非平凡的项目.
功能编程社区还提出了许多其他有趣的想法(除了函数式编程本身),如引用透明性,通用案例表达式(即模式匹配,不像C/C#开关那样残缺)和curried函数,似乎在常规编程中显然很有用,并且应该很容易与现有的编程实践集成,但由于某种原因似乎永远陷入了学术界.
为什么这些功能很难被采用?是否有任何现代的,实用的语言实际上是从Lisp中学习而不是半复杂地复制"一流的功能",还是存在使这不可能的内在冲突?
这个问题来自考试.我不知道该怎么做.:-(
问题:给出一个类型为haskell或ml函数的示例
(a - > b) - >(c - > a) - > c - > b
怎么做?
我是SML的新手,我一直在使用SML/NJ.假设我有以下简单的功能:
fun test(x) = x / 2.0;
Run Code Online (Sandbox Code Playgroud)
试验(0.3); 返回0.15.
我希望它也能用于测试(.3); 现在我收到以下错误:
- test(.3);
stdIn:23.6-23.9 Error: syntax error: deleting DOT INT RPAREN
Run Code Online (Sandbox Code Playgroud)
当然,我希望它可以与任何形式的0.X一起使用.这可行吗?谢谢!
我需要在Standard-ML中描述一种由属性和值组成的语言.我的属性系统由可以具有值的属性组成,例如:
color: red | yellow | blue | transparent
align: left | center | right
bgcolor: red | yellow | blue | transparent
Run Code Online (Sandbox Code Playgroud)
我创建了这个sml文件,试图描述这些属性:
datatype colorvalue = Transparent
| Yellow
| Blue
| Red
datatype bgcolorvalue = Transparent
| Yellow
| Blue
| Red
datatype alignvalue = Left
| Center
| Right
(* Generic property: it can be any of the above *)
datatype property = Color of colorvalue
| BgColor of bgcolorvalue
| Align of alignvalue
(* Some values …Run Code Online (Sandbox Code Playgroud) 我注意到有两种方法可以在SML中定义函数.例如,如果你使用add函数,这有以下两种方式:
fun add x y = x+y;
fun add(x,y) = x+y;
Run Code Online (Sandbox Code Playgroud)
第一种方法创建函数类型:
val add = fn : int -> int -> int
Run Code Online (Sandbox Code Playgroud)
第二个创建函数类型:
val add = fn : int * int -> int
Run Code Online (Sandbox Code Playgroud)
这两种类型对于同一功能有什么区别?还有为什么同一功能有两种类型?
可以匹配文字(显然):
let res = match x with
| "abc" -> 1
| "def" as x -> something_else x
Run Code Online (Sandbox Code Playgroud)
问:但是,是否可以匹配变量的值,因此在整个代码中不会重复文字?
let abc = "abc"
let def = "def"
let res = match x with
| (abc) -> 1
...
Run Code Online (Sandbox Code Playgroud)
(以上当然不符合abc,但在每种情况下都会匹配)
在F#中,可以使用活动模式:
let (|IsAbc|IsDef|) str = if str = abc then IsAbc(str)
else if str = def then IsDef(str)
...
let res = match x with
| IsAbc x -> 1
| IsDef x -> …Run Code Online (Sandbox Code Playgroud) 每个人,ML中的以下任务有什么区别,
val n = 5;
Run Code Online (Sandbox Code Playgroud)
和
n := 1;
Run Code Online (Sandbox Code Playgroud) 我想定义一个int和float的列表,其中[1,2.0]应该是一个有效的构造.
例如,F#在类型或类型层次结构中是否具有int和从数字派生的浮点数?
谢谢.
基本上在我的项目中,我试图将字符串列表写入文件,如下所示:
val mutable rodata_list : (string*string) list = []
.....
let zip1 ll =
List.map (fun (h,e) -> h^e) ll in
let oc = open_out_gen [Open_append; Open_creat] 0o666 "final_data.s" in
List.iter (fun l -> Printf.fprintf oc "%s\n" l) (zip1 rodata_list);
Run Code Online (Sandbox Code Playgroud)
这是我的问题,通常rodata_list可以达到800,000大小,我们的服务器(64-bit, 32 core Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz)上面的代码大约需要3.5秒.. OCaml我使用的版本是4.01.0.
这是不可接受的,特别是因为我有4个像这样的代码写入文件.完全他们可以带我超过15秒..
我试过这个:
Printf.fprintf oc "%s\n" (String.concat "\n" (zip1 rodata_list));
Run Code Online (Sandbox Code Playgroud)
但没有明显的改善..
所以我想知道,如何优化这部分?我感谢任何解决方案.谢谢!
我想编写一个接受自定义类的值的函数myType,然后返回myType option.不确定我的问题是签名,内容还是返回值.
例如,我试图编写以下内容(它已经简化,没有任何实际意义):
let rec myFunc (t:myType) myType option =
let t2 = myFunc t in
match t2 with
| None -> None
| _ -> t
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
错误:此模式匹配'a选项类型的值,但预期模式匹配类型'b - >'c - >'d的值
不确定我的语法有什么问题,或者我误解了OCaml.