[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
| |
Haskell勉強スレッド
1
:
ひきぷろ
:2017/02/25(土) 12:27:25 ID:W05e4jDU0
Haskellの勉強用スレッド
2
:
(-_-)さん
:2017/02/26(日) 09:13:10 ID:???0
・余再帰の例
function [] = []
function (x:xs) = (process x):(function xs)
where
process x = 〜
再帰が別の関数の引数(この場合(:))に登場する
・末尾再帰の例
function writer [] = writer
function writer (x:xs) = function (e:writer) xs
where
e = 〜
定義が始まりから再帰になっている
3
:
(-_-)さん
:2017/02/26(日) 09:25:35 ID:???0
iomonadfunction >>= return . nonmonad
は
nonmonad <$> iomonadfunction
と書き直せる。(∵ IOモナドはファンクタとしてそのように便宜を図る実装がされている)
cf.Control.Applicative
4
:
(-_-)さん
:2017/02/27(月) 05:41:28 ID:???0
そういえばHaskellって名前付けに定番ぽいのあるけどHaskell関連の本で推奨とかされてるのかな?読んだことないけど
リスト系だと末尾にsをつけて x:xs とか
再帰系だと acc というアキュムレータ(?)というやつの名前とか
関数の内側に定義する関数だと loop とか go とかを見かける、メインの関数名の末尾にアポストロフィつけた感じのもあるね
5
:
(-_-)さん
:2017/02/27(月) 05:44:43 ID:???0
アポストロフィは正格評価って意味で使われてることもあるんだっけ?
あと関数名末尾にMをつけるとモナドを意味する場合もあるらしいね
命名とかの慣習系はよく分からない
6
:
(-_-)さん
:2017/03/02(木) 05:55:32 ID:???0
https://downloads.haskell.org/~ghc/7.8.1/docs/html/users_guide/type-class-extensions.html
#overloaded-lists
Overloaded lists
Listみたいな表記方法でMapとか書ける糖衣構文
7
:
(-_-)さん
:2017/03/05(日) 03:48:08 ID:???0
Haskellは関数の呼び出しを重ねることでプログラムを実行する
引数を1つ取る関数 f があり、引数に 30 を与えるなら f 30 また、(f 30) や f (30) や (f (30)) と書ける (※他のプログラミング言語だと f(30) と書くところだがHaskellは違う)
Haskellの関数は一見すると2つ以上の引数を取るように見えるものがあるが実際はちょっと違う
g 20 99 という呼び出しがある場合は ((g 20) 99) という解釈で、(g 20) の戻り値が引数が1つの関数型でその関数に 99 という引数を渡すという感じである
他のプログラミング言語的な書き方にすると (g(20))(99) という感じ(分かりにくい)
例えばHaskellで g の宣言と定義が
g :: Int -> Int -> Int
g x y = x * y
とすると
宣言の g :: Int -> Int -> Int は g :: Int -> (Int -> Int) と解釈し、 g は Int型の引数1つ受け取ると (Int -> Int) の関数を返すという
掛け算の * も関数で、中置記法という書き方で、実際の関数名は丸括弧をつけた (*) となるので g はこうとも書ける
g :: Int -> Int -> Int
g x y = (*) x y
(g 20) は先にxの値だけ決めておいた関数という感じ
8
:
(-_-)さん
:2017/03/05(日) 03:49:38 ID:???0
C++で似たようなことをしようとするとこんな感じになってしまう
http://melpon.org/wandbox/permlink/aKhm1rOf98EAQkFu
#include <iostream>
template<typename R, typename A>
class Func {
public:
virtual R invoke(A) = 0;
};
class FuncX : public Func<int, int> {
int v;
public:
FuncX(int _v) : v(_v) {}
int invoke(int a) { return a * v; }
};
class FuncG : public Func<FuncX, int> {
public:
FuncX invoke(int a) { return FuncX(a); }
} g;
int main() {
std::cout << g.invoke(20).invoke(99);
return 0;
}
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板