2017-04-06 9 views
1

私は現在、The Craft of Functional Programming 2nd Editionを研究しています。私は、私を困惑させた関数の間に書き込むタスクを提示されています。ハスケルで数値関数を書く

関数は、引数として3つの数値をとり、nは、n及びpの間にある場合の間で、M、N、Pが真であるように、それが定義されている、すなわち

between :: Int -> Int -> Int -> Bool 

ブール結果を返します。説明の簡略化のために、関数はtrueを返します。また、3 3 5の間はtrueを返します。

数学的には、X < = YおよびY < = Z

質問はまた、私は数配列は任意の時点でダウンしていないことを確認weakAscendingOrder関数を書くことができることをお勧めします。私はこの機能を書かれているし、私のコードを以下に示します。

weakAscendingOrder :: Int -> Int -> Int -> Bool 
weakAscendingOrder x y z = (x <= y) && (y <= z) 

彼らは本を読んで提供されているので、関数のシグネチャを維持しながら、私は、またはweakAscendingOrderを使用してもしなくても、機能間を書くことができますどのように?

+1

この場合、「between」は何を意味しますか? >、<,<=,> =) – Lazersmoke

+5

あなたの 'weakAscendingOrder'は正確に' between'関数であるようです。 'y 'が' x'と 'z 'の間にあれば' x> = y'( 'y'は少なくとも' x')で 'y <= z'(' y'はせいぜい 'z')これは正確に 'weakAscendingOrder'が言っているものです。 – user2407038

+0

これは実際には真実ですが、それは解決策が単純すぎると思っていましたが、多分そうではないかもしれません –

答えて

0

コメント2つは正確です。 weakAscendingOrder関数の動作は、betweenと同じです。 (x<=y)&&(y<=z)が私の意見では非常に読みやすいですし、うまく仕事をしていませんが

between x y z --using guards 
    |x <= y = y <= z 
    |otherwise = False 

between x y z = if (x <= y) then (y <= z) else False --using if 

between x y z = case (x <= y) of True -> (y <= z) --using case syntax 
           False -> False 

:ここでは、実装のいくつかの追加の味です。