回答:
Huskでは、任意の正の整数が真実であるため、いくつかのプロパティの入力をテストする関数は通常、真実の場合に意味のある結果を返します。
例:
≠ Numbers: Absolute difference
Chars: Absolute difference of code points
Lists: First Index where the differ
Comparisons <, >, ≤, ≥:
For strict comparisons:
Numbers,Chars: max 0 (the appropriate difference¹)
Lists: The first index where the comparison between the two lists is true
For non-strict comparisons:
Numbers,Chars: max 0 (the appropriate difference + 1)
Lists: Either the result of the strict comparison or, if they are equal,
the length of the list + 1
ṗ Index into the list of prime numbers
V The index of the first element for which the condition is true
€ The first index of that element/substring in the list
£ Works like €
& Given two arguments of the same type will return the second argument if false,
otherwise will return the first argument
| Given two arguments of the same type will return the second argument if true,
otherwise will return the first argument
¦ Return the quotient if divisibility holds
Λ,E,Ë Will all return length+1 in truthy cases
Char predicates:
□,±,√,D,½ will each return the codepoint of its argument on truthy cases
¹ 適切な差異とは、文字のコードポイントの差異を意味します。また、引数の順序も指します。すなわち<x y
、x-y
既にご存知かもしれ [₀-₉]+|[₀-₉]
ませんが、現在の行とは異なる行を呼び出す構文の正規表現です。
このヒントは、特定の行で定義された関数を、以下の表の複数の関数の引数として、または以下の1つ以上の関数の引数として単独で呼び出す場合に特に役立ちます。
機能表:
+----------+----------+
|Index |Function |
+----------+----------+
|1 |´ (argdup)|
+----------+----------+
|2 |` (flip) |
+----------+----------+
|3 |m (map) |
+----------+----------+
|4 |z (zip) |
+----------+----------+
|5 |S (hook) |
+----------+----------+
コード内の行には、上から下へそれぞれの0から始まるインデックスでラベルが付けられます。もしN <M 、Mはラベルで、Nは、コードの行数で、ラベルはちょうどラインで定義された関数を表すMを。場合N≤M <N * 6、インデックスにおける上記テーブルから機能表す⌊M÷N⌋を行に定義された関数とM mod nを最初の引数として。N * 6≤Mの場合、インデックスエラーが発生します。
複数行のプログラムがある場合はおそらくご存知のよう₀…₉
に、たとえば
f
g
₁
関数を参照しますg
。これで、入力を常に関数に適用するg
(そしてそれを複数回使用する)場合; このようなもの:
f₁⁰[...]g₁⁰[...]
h
ラムダを導入する必要があります。ラムダを使用すると、追加の使用ごとに1バイトが節約されるためです。
λf⁰[...]g⁰[...])h
自己参照型のラムダ(φχψ
)の場合、入力を再帰関数に直接適用する特殊なケースがあります。これらの場合₀
、新しいラムダを定義してを使用する代わりに、添え字を使用する方が良いでしょう⁰
。
Γ
リストでのパターンマッチングまたはリストの分解Γ
と呼ばれる組み込みの主な用途は、リストを先頭と末尾に分割し、それらにバイナリ関数を適用することです。これはHaskellのパターンマッチングイディオムに対応します
f (x : xs) = <something>
f [] = <something else>
where <something>
はx
、xs
およびを含む式f
です。の4つのオーバーロードがありΓ
、それぞれが少し異なります。
list
最初のオーバーロードlist
は、値a
とバイナリ関数を取りますf
。リストを受け取る新しい関数を返し、a
空の場合は戻り、f
空でない場合は先頭と末尾を呼び出します。たとえばΓ_1€
、リストを-1
取得し、空の場合は戻り、そうでない場合はテールの最初の要素の最初の出現のインデックスを返します。
listN
第二のオーバーロードはlistN
、同様であるlist
ことを除いて、a
省略され、戻り型のデフォルト値が代わりに使用されています。たとえば、Γ€
はΓ0€
デフォルトの数値がであるため、と同等です0
。
デフォルト値は無関係であるか、正確に必要なものであるため、実際にlistN
は、よりも頻繁に使用されlist
ます。一般的なパターンはΓ~αβγ
で、αβγ
3つの関数があります。これはβ
最初の要素とγ
テールに適用され、結果をと結合しますα
。たとえば、この回答で使用されました。他のパターンには、最初の要素にのみΓo:α
適用するα
ものと、最初の要素以外のすべての要素にΓ·:mα
適用α
するものがあります。後者はこの回答で使用されました。
listF
3番目のオーバーロードはもう少し複雑です。のようにlist
、値a
とf
関数g
を受け取り、リストを受け取る新しい関数を返します。ただし、今回f
は追加の関数引数を取ります。これはg
それ自体であり、任意の値(入力リストの末尾を含むが、これに限定されません)で呼び出すことができます。これは、リストにlistF
一般的な再帰スキームを実装することを意味します。
/をlistF
使用した明示的な再帰は、通常この回答のように同じ長さまたは短いため、あまり使用されません。list
listN
listNF
listNF
あるlistF
何listN
にあるlist
の入力は:a
省略され、戻り値の型のデフォルト値が代わりに使用されます。まれに、この回答のように、右折りより短くなる場合があります。
の再帰バージョンの例として、Γ
関数Γλ·:o⁰↔
はリストを最初、最後、2番目、最後から2番目、3番目、最後から3番目の順序でシャッフルします。
オンラインでお試しください!
関数f
は明示的なlambda λ·:o⁰↔
であり、その引数⁰
は関数全体です。何f
んと、尾を逆である↔
と再帰的にメイン関数を呼び出し、その後、o⁰
、そして最後に頭のバックタック·:
。もちろん、Γ·:o₀↔
バイトは短くなりますが、行にこの関数以外のものが含まれている場合は機能しません。
整数Xのリストがあり、length(X)より大きいXの要素の総数をカウントするとします。述部を満たす要素のカウントは高次関数で行われますが、ここでは述部(length(X)より大きい)はXに依存します。解決策は、コンビネータ適用することであるとし、機能リストは数よりも短くなっているかどうかのチェックを。関数では、リストXはに渡され、部分的に適用された関数はに渡され、Xは2番目の引数として渡されます。#
Ṡ
#
o>L
Ṡ#o>L
o>L
#
#
一般に、α
が高階関数である場合β
、バイナリ関数とγ
単項関数Ṡαβ
はHaskell擬似コードと同等です。
\x -> α (\y -> β x y) x
§αβγ
に等しい
\x -> α (\y -> β x y) (γ x)
と~αβγ
同等です
\x y -> α (\z -> β x z) (γ y)
タイプが一致する限り。
別の具体例として、§►δṁ≠P
リストの順列見つけXの値が対応する差分絶対値和を最大Xを(δṁ≠
絶対差を使用して2つのリストをジッパーとの和をとります)。
ハスクは、たとえばlast
空のリストの要素を取得しようとしたときに問題が発生するHaskellほど厳密ではありません。これを実現するために、定義済みの値を使用します。デフォルト値、最大値と最小値のリストは次のとおりです。
.------------------------------------.---------------.----------.-------.
| Type (X and Y are placeholders) | default (def) | max | min |
|------------------------------------|---------------|----------|-------|
| Character (C) | ' ' | \1114111 | \NUL |
| Numbers (N) | 0 | Inf | -Inf |
| List of X (LX) | [] | ∞ max | [] | *
| Function :: X -> Y | const (def Y) | n/a | n/a |
'------------------------------------'---------------'----------'-------'
*ここで、∞は対応する最大値の無限リストを表す必要があります(例については以下を参照)
注:タプル(X、Y)の場合、各コンポーネントの値を個別に使用します。
最大値と最小値は▲▼
空のリストでのみ使用されますが(たとえばhusk -u "▼" "[]:LLN"
、無限のリストを返しInf
ます)、デフォルト値はいくつかの場所で使用されます:
F
およびḞ
)Θ
)r
)が失敗したとき←→
)または1つへのインデックス付け(!
)Γ
空のリストでのパターンマッチング()►
または◄
空のリストに