2016-08-11 1 views
2

MLで、引数がリストとintである関数を作る必要があり、関数はリストのすべての要素をとり、指定されたintでそれを動かします。だから私は、すでに以下のコード化されました:MLでリストヘッドをintとして使う

(* power function (power x y => x^y) *) 
fun power x 0 = 1 
| power x 1 = x 
| power x y = x * (power x (y - 1)); 

をし、これが主な機能です:

fun powlist [] n = [] 
| powlist lst n = ((power hd(lst) n) :: (powlist tl(lst) n)); 

それは理にかなって、私は思いますが、コンパイラ(モスクワML)は次のことを示しています error message

答えて

0

機能アプリケーションが最も強い結合力を持っていて、hd(lst)が実際にhd lstなので、(power hd(lst) n)(power hd lst n)と理解されていますhdは、リストlstではなく、power関数に引数として渡されています。

fun powlist [] n = [] 
    | powlist lst n = (power (hd lst) n) :: (powlist (tl lst) n) 

しかし、それは慣用SMLコードではありません。これを改正する

一つの方法は、いくつかの括弧を再配置することです。

fun powlist []  n = [] 
    | powlist (h::tl) n = (power h n) :: (powlist tl n) 

、おそらく最良の方法は、より一般的であり、いくつかのSMLの実装でtail-recursiveとして実装されている標準List.map機能、使用することです:

をわずかに良いアプローチは、パターンマッチングを使用することです
fun powlist lst n = List.map (fn x => power x n) lst 

ところで、power関数はもう少し簡潔に書くことができます。完璧に動作

fun power x 0 = 1 
    | power x y = x * (power x (y - 1)) 
+0

。どうもありがとうございました! – athoslag

関連する問題