fun curry f x y = f (x, y);
fun uncurry f (x, y) = f x y;
fun compose (f, g) x = f (g x);
Run Code Online (Sandbox Code Playgroud)
我理解compose功能,但不太了解ML中的curry和uncurry.谁能解释一下这些?
另外,以下两行是什么意思?
(1) compose (compose, uncurry compose)
(2) compose (uncurry compose, compose)
Run Code Online (Sandbox Code Playgroud) 我(相信)以下函数定义是尾递归的:
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
if x > y
then false
else is_sorted (y::xs)
Run Code Online (Sandbox Code Playgroud)
琐碎的是,它等同于以下声明
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
(x <= y) andalso (is_sorted (y::xs))
Run Code Online (Sandbox Code Playgroud)
然而在这个版本中,最后一步是应用'andalso',所以它不是尾递归的.或者它似乎是这样,除了因为(至少是标准的)ML(NJ)使用短路评估,并且实际上/不是/最后一步.那么这个函数会有尾调用优化吗?还是有任何其他有趣的实例,其中明显使用尾递归的ML函数实际上得到优化?
我试图将两个计数和tfidf用作多项NB模型的特征.这是我的代码:
text = ["this is spam", "this isn't spam"]
labels = [0,1]
count_vectorizer = CountVectorizer(stop_words="english", min_df=3)
tf_transformer = TfidfTransformer(use_idf=True)
combined_features = FeatureUnion([("counts", self.count_vectorizer), ("tfidf", tf_transformer)]).fit(self.text)
classifier = MultinomialNB()
classifier.fit(combined_features, labels)
Run Code Online (Sandbox Code Playgroud)
但是我在使用FeatureUnion和tfidf时遇到错误:
TypeError: no supported conversion for types: (dtype('S18413'),)
Run Code Online (Sandbox Code Playgroud)
知道为什么会发生这种情况吗?是不是可以将两个计数和tfidf作为功能?
我在考虑这样的函数:
> let applyN (initial : 't) (n:int) (f : 't -> 't) = seq {1..n} |> Seq.fold (fun s _ -> f s) initial;;
val applyN : initial:'t -> n:int -> f:('t -> 't) -> 't
> applyN 0 10 (fun x -> x + 1);;
val it : int = 10
Run Code Online (Sandbox Code Playgroud)
注意:代码是F#,但我用haskell,ocaml和ml标签标记了问题,因为如果函数在F#库中不存在但是它存在于其他语言中我想使用相同的名称
例如以下功能:
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n - 1)
Run Code Online (Sandbox Code Playgroud)
或者在功能中:
fun even 0 = true
| even x = odd(x-1)
and odd 0 = false
| odd x = even(x-1);
Run Code Online (Sandbox Code Playgroud)
我对ML的经验很少,我只是想了解基础知识.
在OCaml中,功能应用的评估顺序未指定(也称为非确定性).
在标准ML中,它是否也是非确定性的或确定性的?您能否提供澄清的规格部分的参考?
编辑:对于你后来的人,我也学到了像SML一样,在F#中指定顺序和确定性 - 与OCaml不同,考虑到两者在语法上的接近程度,这更加疯狂.如果你在他们之间切换很容易忘记.
对于像ML系列那样的函数式语言,这是一个关于静态类型系统的软问题.我理解为什么你需要数据类型来描述像列表和树这样的数据结构,但是像数据类型中的命题逻辑那样定义"表达式"似乎带来了一些便利并且不是必需的.例如
datatype arithmetic_exp = Constant of int
| Neg of arithmetic_exp
| Add of (arithmetic_exp * arithmetic_exp)
| Mult of (arithmetic_exp * arithmetic_exp)
Run Code Online (Sandbox Code Playgroud)
定义一组值,您可以在其上编写一个eval
可以为您提供结果的函数.你也可以同样定义了4个功能:const: int -> int
,neg: int -> int
,add: int * int -> int
和mult: int * int -> int
,然后排序的表达add (mult (const 3, neg 2), neg 4)
会给你同样的事情,不带静电安全的任何损失.唯一的复杂因素是你必须做四件事而不是两件事.在学习SML和Haskell时,我一直在考虑哪些功能为您提供了必要的东西,哪些只是一种便利,所以这就是我要问的原因.我想如果你想要从值本身分离一个值的过程,这就很重要,但我不确定哪个有用.
非常感谢.
ML如何在以下函数定义中执行类型推断:
let add a b = a + b
Run Code Online (Sandbox Code Playgroud)
它是否像C++模板一样,在模板实例化之前不执行类型检查,如果类型支持必要的操作,函数可以工作,否则会抛出编译错误?
即,例如,以下功能模板
template <typename NumType>
NumType add(NumType a, NumType b) {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
会为...工作
add<int>(23, 11);
Run Code Online (Sandbox Code Playgroud)
但不会起作用
add<ostream>(cout, fout);
Run Code Online (Sandbox Code Playgroud)
我猜的是正确的还是ML类型的推理工作方式不同?
PS:抱歉我的英语不好; 这不是我的母语.
关于标准ML编译器,我的问题是,尽管ML本身已经正式定义,可以证明程序的确定性评估,但是编译器本身是用C语言编写的,这是不是正式定义的,至少不是全部的?我想我的问题是我们用标准ML编写一个程序并且可以证明它的正确性,我们怎么知道C编写的编译器没有以可能改变结果的方式执行?
谢谢
我想创建一个函数remove_duplicates
,它接受list
任何类型的 a (例如可以是 anint list
或 abool list
或 aint list list
或 a whatever list
)并返回没有重复的相同列表,这在标准机器学习中可能吗?