k***t 发帖数: 769 | 1 Write a function increasing: int list -> bool that returns true if its
input is a list of integers in increasing order.
Define function addOneToAll(x, L) that takes a value
x and add it to all the elements in L, which is a list of lists.
For example, addOneToAll(1, [nil, [2], [3], [2,3]]) = [[1], [1,2], [1,3], [1
,2,3]].
才开始学编程,这两个怎么写啊?
第二个题,我写了这样的可是不工作:
-fun addOneToAll(a,nil)=nil
|fun addOneToAll(a,[x]::[y]::nil)=(a::[x])::addOneToAll(a,[y]::nil)::nil;
希望大家帮我。 | k***t 发帖数: 769 | | G***l 发帖数: 355 | 3 不懂ML,用同样ML family的F#解答一下,你应该可以看明白
第一个问题,思路:list为空的时候怎么办?list只有一个的时候怎么办?list有多个
的时候怎么办?
let rec IsMonoIncreasing = function
| [] -> true
| first::second::remain ->
match second > first with
| false -> false
| true -> IsMonoIncreasing (second::remain)
| singleElement::[] -> true
注意为什么要把至少2个的情况放在只有一个的情况前面。
第二个就不写code了,不过x::y::nil应该match的是只有两个元素的list吧?你应该
match用 x::remain
[1
【在 k***t 的大作中提到】 : Write a function increasing: int list -> bool that returns true if its : input is a list of integers in increasing order. : Define function addOneToAll(x, L) that takes a value : x and add it to all the elements in L, which is a list of lists. : For example, addOneToAll(1, [nil, [2], [3], [2,3]]) = [[1], [1,2], [1,3], [1 : ,2,3]]. : 才开始学编程,这两个怎么写啊? : 第二个题,我写了这样的可是不工作: : -fun addOneToAll(a,nil)=nil : |fun addOneToAll(a,[x]::[y]::nil)=(a::[x])::addOneToAll(a,[y]::nil)::nil;
| k***t 发帖数: 769 | 4 太谢谢了。我会顺着你的思路再看看。
【在 G***l 的大作中提到】 : 不懂ML,用同样ML family的F#解答一下,你应该可以看明白 : 第一个问题,思路:list为空的时候怎么办?list只有一个的时候怎么办?list有多个 : 的时候怎么办? : let rec IsMonoIncreasing = function : | [] -> true : | first::second::remain -> : match second > first with : | false -> false : | true -> IsMonoIncreasing (second::remain) : | singleElement::[] -> true
| p*****3 发帖数: 488 | 5
[1
想歪了,面壁...
【在 k***t 的大作中提到】 : Write a function increasing: int list -> bool that returns true if its : input is a list of integers in increasing order. : Define function addOneToAll(x, L) that takes a value : x and add it to all the elements in L, which is a list of lists. : For example, addOneToAll(1, [nil, [2], [3], [2,3]]) = [[1], [1,2], [1,3], [1 : ,2,3]]. : 才开始学编程,这两个怎么写啊? : 第二个题,我写了这样的可是不工作: : -fun addOneToAll(a,nil)=nil : |fun addOneToAll(a,[x]::[y]::nil)=(a::[x])::addOneToAll(a,[y]::nil)::nil;
| p*****2 发帖数: 21240 | 6 第一题
(defn f [list & args]
(let [f (first list) r (rest list) [prev] args]
(cond (empty? list) true
(nil? prev) (dfs f r)
(< prev f) (dfs f r)
:default false))) | p*****2 发帖数: 21240 | 7 第二题
(defn f [x list] (map #(cons x %) list)) | G***l 发帖数: 355 | 8 你这是lisp family的语言吧?lisp跟ML差别还是很大的。没学过lisp的不太可能看的
懂。楼主一看就是初学者。
【在 p*****2 的大作中提到】 : 第一题 : (defn f [list & args] : (let [f (first list) r (rest list) [prev] args] : (cond (empty? list) true : (nil? prev) (dfs f r) : (< prev f) (dfs f r) : :default false)))
| p*****2 发帖数: 21240 | 9
这样呀。我不懂ml。主要的区别是啥呀?我以为思想都差不多呢。
【在 G***l 的大作中提到】 : 你这是lisp family的语言吧?lisp跟ML差别还是很大的。没学过lisp的不太可能看的 : 懂。楼主一看就是初学者。
| G***l 发帖数: 355 | 10 那java和lisp主要差别是啥呀?差别很大的两个语言,这个话题一两句话哪说的清。
但你看看我前面F#写的code,和你那个lisp完全不同吧。
【在 p*****2 的大作中提到】 : : 这样呀。我不懂ml。主要的区别是啥呀?我以为思想都差不多呢。
| | | p*****2 发帖数: 21240 | 11
你那个我能看懂 跟我的差不多 就是有点不简练
【在 G***l 的大作中提到】 : 那java和lisp主要差别是啥呀?差别很大的两个语言,这个话题一两句话哪说的清。 : 但你看看我前面F#写的code,和你那个lisp完全不同吧。
| G***l 发帖数: 355 | 12 反正我要是没学过lisp,你那个我绝对看不懂。
不过lisp说别人不简练?F#的7行,你lisp的9行。不考虑我定义的变量名的长度的话,
每行也比你短吧。
【在 p*****2 的大作中提到】 : : 你那个我能看懂 跟我的差不多 就是有点不简练
| p*****2 发帖数: 21240 | 13
我感觉lisp跟java的差别,比lisp跟ml的差别大多了。
你就是用了个pattern matching吧。我是觉得应该看看怎么把有一个元素和没有元素的
情况合并一下。倒不是说行数。
【在 G***l 的大作中提到】 : 反正我要是没学过lisp,你那个我绝对看不懂。 : 不过lisp说别人不简练?F#的7行,你lisp的9行。不考虑我定义的变量名的长度的话, : 每行也比你短吧。
| G***l 发帖数: 355 | 14 这不是要写的最简单最直观,让初学者看的懂嘛。
用lisp family的scheme写一个:
(define (isMonoInc? x)
(cond
((or (null? x) (null? (cdr x))) #t)
((< (car x) (car (cdr x))) (isMonoInc? (cdr x)))
(else #f)))
【在 p*****2 的大作中提到】 : : 我感觉lisp跟java的差别,比lisp跟ml的差别大多了。 : 你就是用了个pattern matching吧。我是觉得应该看看怎么把有一个元素和没有元素的 : 情况合并一下。倒不是说行数。
| p*****2 发帖数: 21240 | 15
我也把我的程序update了一下,6行。
你刚才怎么说看不懂我的?你不是会lisp吗?
【在 G***l 的大作中提到】 : 这不是要写的最简单最直观,让初学者看的懂嘛。 : 用lisp family的scheme写一个: : (define (isMonoInc? x) : (cond : ((or (null? x) (null? (cdr x))) #t) : ((< (car x) (car (cdr x))) (isMonoInc? (cdr x))) : (else #f)))
| G***l 发帖数: 355 | 16 我是说如果我不会lisp。。。
ml也可以写的很简洁,但是初学者可能看不懂
let rec IsMonoInc = function
| [] -> true
| [f] -> true
| f::((s::_)as remain) -> if f >= s then false else IsMonoInc(remain)
【在 p*****2 的大作中提到】 : : 我也把我的程序update了一下,6行。 : 你刚才怎么说看不懂我的?你不是会lisp吗?
| p*****2 发帖数: 21240 | 17
这样呀。你到提醒我应该去看一下clojure的pattern matching了,刚发现他们也有一
个。一会儿瞧瞧去。
【在 G***l 的大作中提到】 : 我是说如果我不会lisp。。。 : ml也可以写的很简洁,但是初学者可能看不懂 : let rec IsMonoInc = function : | [] -> true : | [f] -> true : | f::((s::_)as remain) -> if f >= s then false else IsMonoInc(remain)
| p*****2 发帖数: 21240 | 18
大牛会多少种fp语言呀?
【在 G***l 的大作中提到】 : 我是说如果我不会lisp。。。 : ml也可以写的很简洁,但是初学者可能看不懂 : let rec IsMonoInc = function : | [] -> true : | [f] -> true : | f::((s::_)as remain) -> if f >= s then false else IsMonoInc(remain)
| G***l 发帖数: 355 | 19 不是大牛。scheme会一些。haskell学了一点后来没有空学了。现在用的最多的是F#,
因为是.net上的。.net上没有支持比较好的lisp family的。不过有的话我可能也不太
会用,虽然理解,但是欣赏不了括号。。。。
【在 p*****2 的大作中提到】 : : 大牛会多少种fp语言呀?
| H****S 发帖数: 1359 | 20 1. fun (xs) = case xs of
[] => true
| x::[] => true
| x::y::xs' => if (x <= y) fun (y::xs') else false
2. fun addOneToAll(x, L) = case L of
[] => []
| y::ys => (x::y) :: (addOneToAll (x, ys))
Most amazing thing about ML is although everything is static typed, you don'
t need to specify which class/type the input argument is and return value is
-- type inference will all handle that for you :-)
BTW Dan Grossman recently opened a course "Programming Language" in coursera
. If you are interested in learning ML, I would suggest going there.
[1
【在 k***t 的大作中提到】 : Write a function increasing: int list -> bool that returns true if its : input is a list of integers in increasing order. : Define function addOneToAll(x, L) that takes a value : x and add it to all the elements in L, which is a list of lists. : For example, addOneToAll(1, [nil, [2], [3], [2,3]]) = [[1], [1,2], [1,3], [1 : ,2,3]]. : 才开始学编程,这两个怎么写啊? : 第二个题,我写了这样的可是不工作: : -fun addOneToAll(a,nil)=nil : |fun addOneToAll(a,[x]::[y]::nil)=(a::[x])::addOneToAll(a,[y]::nil)::nil;
| c***C 发帖数: 139 | 21 第一题
fun increasing(lst: int list) =
case lst of
[] => true
| i::[] => true
| i::(j::lst') => i < j andalso increasing(lst')
第二题
fun addOneToAll思路跟第一题相似
[1
【在 k***t 的大作中提到】 : Write a function increasing: int list -> bool that returns true if its : input is a list of integers in increasing order. : Define function addOneToAll(x, L) that takes a value : x and add it to all the elements in L, which is a list of lists. : For example, addOneToAll(1, [nil, [2], [3], [2,3]]) = [[1], [1,2], [1,3], [1 : ,2,3]]. : 才开始学编程,这两个怎么写啊? : 第二个题,我写了这样的可是不工作: : -fun addOneToAll(a,nil)=nil : |fun addOneToAll(a,[x]::[y]::nil)=(a::[x])::addOneToAll(a,[y]::nil)::nil;
|
|