2015-05-25 42 views
0

我挣扎了一下用F#-assignment,我希望你能回答单纯的评价:我有F#记录,这

我们将使用声明的类型OrderedList<’a>如下

type OrderedList<’a when ’a : equality> = 
    { front: ’a list 
    ; rear: ’a list} 

例如,值let ex = {front = [’x’]; rear = [’z’;’y’]}有 型OrderedList<char>和代表有序列表[’x’, ’y’, ’z’]

我正在挣扎的问题是:

我们定义一个有序列表的规范表示是 表示,其中后列表为空。声明函数 canonical:OrderedList<’a>->OrderedList<’a>,其中canonical ol返回 ol的标准表示形式。

就像一启动,我试过的东西:

let canonicial (list:OrderedList<'a>)= 
    match list with 
    | {x::xs}, {y::xss} -> if x = y then "SUCCESS!!!!" else failwith "FEJL!!!" 
    | _ -> failwith "Some" 

我的问题是,我不知道怎么去的元素类型/语法此。我知道这个函数没有被正确解决,但现在我主要关注语法。

希望得到一些帮助!

+0

你读过关于模式匹配的msdn文档吗? –

+0

是的,我似乎无法弄清楚。:( – user3408128

+0

重读有资格的'记录模式'部分 –

回答

2

嗯,我想我可以给你的解决方案现在(你一定有更多的问题需要解决):

let canonical = 
    function 
    | { front = _; rear = [] } as ol -> ol 
    | { front = fs; rear = rs } -> { front = fs @ List.rev rs; rear = [] } 

,你可以看到第一种情况是当后已经是空的 - 这足以给原回

在其他情况下,我们必须得到一个新的OrderedList<'a>在颠倒旧后追加到老的前面 - 这是它 - 你甚至都不需要对'a约束 - 事实上我觉得奇怪把它放在那里 - 通常情况下,除了FP中的功能限制外,更好 - 但风格不同和东西。

我希望这可以帮助你有点

BTW:我故意用function - 你应该尝试将其转换成你平时match ... with ...风格,所以你可以得到你的语法正确

+2

hey - FP是*未来 - 很可能你必须编写功能代码 - 无论是Java,Swift,Haskell,F#,JavaScript,不管 - 你要编码 - 你会更好地发挥功能(它真的*现在看起来有点这样 - 最好不要忘记 - 学会掌握不要通过!) – Carsten

+0

我记得,先生! :) – user3408128

1

谢谢,谢谢,谢谢!现在我更好地理解这个话题!我重写你的代码:

let canonical2 (ol:OrderedList<'a>) : OrderedList<'a> = 
    match ol with 
    |{ front = _; rear = []} -> ol 
    |{ front = f; rear = r} -> {front = f @ List.rev r; rear = []} 
+0

是的,看起来不错;) - 但请记住,在这种情况下,您可以只用'...与ol.rear匹配......“,并且您将以少得多的击键和{}'逃脱:D – Carsten

+0

还有FPlers喜欢编写'rs'和'xs'和东西来说这些是值的列表(或其他集合);) - 那么猜猜'xss'是什么? – Carsten

+0

列表? :p – user3408128

1

另一种方式来做到这一点理所当然地认为@已经照顾中返回的“其他列表”如果是空的(所以不应该是一个开销总是附加):

let canonical ol = { ol with front = ol.front @ List.rev ol.rear; rear = [] } 
// or 
let canonical { front = fs; rear = rs } = { front = fs @ List.rev rs; rear = [] } 
+0

当然,这是一个**错误**,因为你以相反的顺序追加尾部 - 但是这个想法本身并不坏;) – Carsten