2017-10-13 4 views
1

だから私はヘッド(xs)を別の関数に1つの引数として渡すにはどうすればよいですか?

intCMP :: Int -> Int -> Ordering 
intCMP a b | a == b =EQ 
      | a < b = LT 
      | otherwise = GT 

この機能を持っており、このリストは、私がリストに関する情報を検索しようとしているが、私はこのintCMP

にtroouble通過要素を抱えている

xs = [1,2,3] 

を定義し私がしようとしているものです

intCMP head(xs) 1 

しかし、これは私にとって、それはあまりにも多くの議論があると言っている。

あなたはHaskellの関数適用に空白のみであるので、異なる

intCMP (head xs) (head $ tail xs) 

括弧を設定する必要が

<interactive>:2:9: error: 
     • Couldn't match expected type ‘Int’ with actual type ‘Integer’ 
     • In the first argument of ‘intCMP’, namely ‘(head xs)’ 
     In the expression: intCMP (head xs) 1 
     In an equation for ‘it’: it = intCMP (head xs) 1 
+0

すると、正確な出力を共有してもらえあなたのプログラムを実行し、そしてソースコードの統一されたビュー? –

+0

これは私がソースコードとして持っているだけで、関数とリストが定義されています。しかし、私はあなたにエラーを表示します。 – christian

+0

'intCMP(head xs)1'と' intCMP head(xs)1'には違いがあります。 – chepner

答えて

2

エラーは引数が多すぎるということではなく、Intの代わりにIntegerというリスト要素の型に関するものです。

あなたはここに2つの選択肢があります。

まず:すべてOrd(発注)タイプが受け入れられるようにすることによって、あなたの関数は、より一般的な作り

intCMP :: (Ord a) => a -> a -> Ordering 
intCMP a b | a == b =EQ 
      | a < b = LT 
      | otherwise = GT 
(この機能は compareとしてプレリュードで利用可能であることに注意してください)

第二に、fromIntegralを使用して、必要なものにあなたのリストの要素の型をキャスト:

intCMP (fromIntegral $ head intxs) 1 
1

あなたの式は、あなたが意図したものではないintCMP head xs head (tail xs)として解析されます。

4

ハスケルでは、関数の名前を入力し、その後に各引数を入力することによって関数が呼び出されます。引数はスペースで区切られます。

他の言語、特にCの子孫では、引数を角かっこで渡してメソッドを呼び出しますが、ハスケルでは呼び出されません。角かっこは関数呼び出しを示すものではなく、通常の演算子の優先順位を変更するために使用されます。

通常の演算子のように、演算子の優先順位は正常です。たとえば、1 + 2 * 31 + (2 * 3)と同じですので、通常は後者を記述しません。ただし、乗算の前に加算を評価する場合は、角括弧を使用して標準からの偏差を示します。(1 + 2) * 3

ハスケルでも同じです。あなたはこのように行うことができ、intCMPに2つの値を渡す必要があります。

Prelude> intCMP (head xs) (head (tail xs)) 
LT 

基本的に、あなただけのビットの周りにブラケットを移動する必要があります。

+0

まだ私にエラーがあります – christian

+1

@christianどのエラー?あなたが何をするとき? –

関連する問題