1read 100read
2013年03月プログラム63: 関数型プログラミング言語Haskell Part21 (744) TOP カテ一覧 スレ一覧 2ch元 削除依頼
日下部陽一著 作ってわかるCプログラミング(第6版) (533)
エスパーが質問に答えるスレ (309)
Tapestryについて語ろうよ! (808)
D言語 Part31 (270)
C++でXML(主にxerces)やろう! (675)
【コボル】COBOL不要論【ただのDSLだよね?】 (350)

関数型プログラミング言語Haskell Part21


1 :2013/01/21 〜 最終レス :2013/03/12
haskell.org
ttp://www.haskell.org/
日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/
過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/

2 :
関連書籍
・Introduction to Functional Programming Using Haskell (2nd ed.)
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0134843460/
・Haskell: The Craft of Functional Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0201342758/
・The Fun of Programming
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0333992857/
・The Haskell School of Expression: Learning Functional Programming Through Multimedia
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521644089/
・入門Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4839919623/
・ふつうのHaskellプログラミング
 ttp://item.rakuten.co.jp/book/4052963/
・Programming in Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0521692695/
・Real World Haskell
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0596514980
・関数プログラミングの楽しみ
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4274068056
・すごいHaskellたのしく学ぼう!
 ttp://www.amazon.co.jp/dp/4274068854

3 :
関連リンク
・GHC Wiki
 ttp://hackage.haskell.org/trac/ghc/wiki/TitleIndex
・A History of Haskell
 ttp://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/
・関数型関連の用語集
 ttp://sky.zero.ad.jp/~zaa54437/programming/concepts/
・本物のプログラマはHaskellを使う
 ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/?ST=ittrend
・Haskell API search Engine
 ttp://www.haskell.org/hoogle/
 【簡単な使い方】
 1.検索バーに関数名を入れて検索
  例 map
 2.検索バーに型名を入れて検索
  例 (a -> b) -> [a] -> [b]
・Real World Haskell
 ttp://book.realworldhaskell.org/read/
・Learn You a Haskell for Great Good!
 ttp://learnyouahaskell.com/chapters

4 :
Haskell初心者ですが、RealWorldHaskell読んでいて、状態モナドもどきを自作してみようと思って
newtype State s a = StateMonad { stateFunc :: s -> (a,s) }
とやってみて
somefunc :: (a -> b) -> State s a -> State s b
somefunc f (StateMonad g) = StateMonad( \s-> (f(fst(g s)), snd(g s)))
は通るのに
instance Functor (State s) where
fmap :: (a -> b) -> State s a -> State s b
fmap f (StateMonad g) = StateMonad( \s-> (f(fst(g s)), snd(g s)))
が通らないのがわからなくて困っています。
★質問: fmap をどのように宣言するのが正解なのでしょうか?
(fmap :: (a -> b) -> State s a -> State s b の一行を消しても型推論で通りますが、それは気持ち悪いのです)。

5 :
1(゚д゚ )乙 これは乙じゃなくてポニーテールなんたらかんたら
自分も基礎的質問で申し訳ないが
Free Monadがらみの記事にあった
data Fix f = Fix (f (Fix f))
はどういう意味になるんでしょう?
data Fix f = FixC (f (Fix f))でもいいものだと思いますが、コンストラクタ引数のf (Fix f)がわからんとです。FixCに2つの引数を渡す?
でもそれだとdata Fix f = FixC f (Fix f)となるんでしたでしょうか?
二つの型を型引数としてもつ型を渡すという意味?
http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html

6 :
>>5
data Fix f =Fix (f (Fix f))
とすると、値コンストラクタFixは、ひとつの f (Fix f) 型の引数をとる
Fixはkindが (*->*)->*
fはkindが *ー>*
つまり、f自体が何かひとつの型引数をとるということ
fを[]とすれば
Fix::[Fix []] ー> Fix []
fをMaybeとすれば
Fix::Maybe (Fix Maybe) -> Fix Maybe
fを(,) a とすれば
Fix::(a, Fix ( (,) a ) ) -> Fix ( (,) a )

7 :
教わって解決しましたマン
Functorインスタンスはfmap の型宣言書いちゃいけないんですね

8 :
>>6
重ねてですまんが"f(Fix f)"の意味が分からんです・・・
Fix fの値を受け取るコンストラクタを持つfという型って意味でよい?

9 :
f (Fix f)は型引数としてFix fをとる型
[Fix f]とかMaybe (Fix f)とかIO (Fix f)

10 :
了解です。ありー
ちょっと咀嚼してきまふ(´・ω・`)

11 :
新スレおめでとうございます^^

12 :
>>4
標準だと、instance宣言の中ではメソッドの型は宣言できない
書くまでもなく型は決まってるし

13 :
エラーメッセージでそのこと言及してくれよコンパイラ

14 :
>>12
ありがとうございます。

15 :
haskellで書いたプラグインを動的に読み込む仕組みってないですか?

16 :
xmonad方式はどう?

17 :
>>16
言語処理系を作ってるので、ユーザー側で他の処理系(ghc)が必要っていうのは避けたいんですよね
ファイルをディレクトリに置いたら読み込めるっていうのが理想なんですが
やっぱりffiで共有ライブラリを読み込むしかないんですかね

18 :
function sum(a, b){
return a + b;
}
sum("こんにちは");
これをhaskellで書くとどうかけますか?

19 :
わけがわからないよ

20 :
>>18
sum' x y = x + y
main = let
hello = sum' "こんにちは"
in putStrLn "Hello"
コンパイルエラーになるけど

21 :
>>20
オブジェクト指向しかやってないからさっぱりわからないです
関数型ってむずかしいですね

22 :
わけがわからないよ…

23 :
>>18は何言語でどういう動作を期待してるの?

24 :
>>21
自分も勉強中なのだけど、「入門Haskell」や
「すごいHaskellたのしく学ぼう!」 (>>2を参照)
あたりを通読するのを勧める。C++知ってる人がPerlを学ぶとか
Pythonを学ぶのとかなり違った難しさがある。
英語がさほど苦手ではないなら「すごいHaskellたのしく学ぼう!」
の原書は
ttp://learnyouahaskell.com/chapters
で読めるよ。

25 :
サム「こんにちは」

26 :
プログラミングhaskell読んでるけど7章あたりで頭が追いつかなくなってきたわ。。。

27 :
dataのあたりで今詰まってる。ShapeとかCircleで説明してるやつ。
オブジェクト指向とちょうど逆になってるのかな。
何が逆かはうまく説明できないけど、なんかそんな感覚。

28 :
オブジェクト指向って何やってんの
そうまで他の言語を難しく考えることもないと思うんだけど

29 :
オブジェクト指向的にインタフェースと多態で書くと、
・データの種類(クラス)の追加は簡単
・処理(メソッド)の追加は面倒
代数的データ型で書くと、
・データの種類(構築子)の追加は面倒
・処理(パターンマッチする関数)の追加は簡単

30 :
データの種類で最も重要なのは
・null
・null以外
の二種類
nullという種類の追加が面倒という性質は
静的型付けの存在理由に関わる重要な性質だ

31 :
オブジェクト指向的な多態とnullは関係ないだろ
Haskellにだって、nullよりある意味厄介な⊥というのがあるし

32 :
lazyは厄介だ
実行時よりもコンパイル時という考え方に反する

33 :
bottomを厄介者扱いとかバチあたりな

34 :
リストをたくさん結合すると非効率というのがいまいちわからない
実際どういう状況で非効率になるの?

35 :
たくさんが問題じゃなくて ++ が問題。
後半のリストは共有できるにしても、前半のリストは複製しなきゃなんない。

36 :
>>29
オブジェクト脳の俺にもう少し(もうだいぶ)詳しく教えてくれないか ?
ちなみに上の人とは別でこのすれ初かきこです

37 :
>>34
配列ならスペースを多めに取ってnullを入れておく状況とか
仕様を正確に知っている人でも、必要なスペースは予測できない
仕様書には知っていることだけ書けばいいが
コードには予測できないことまで書かないと上手く動かない

38 :
関係ないが、講議で、ソフトウェア科学における最悪の発明が「NULL」という話を聞いた

39 :
発明した人と批判した人の両方が賞をもらえるという話をどこかで聞いたような気がする

40 :
>>38
UNKNOWN先生がアップを始めたようです

41 :
最高の発明だよ

42 :
NULLはビリオンダラーミステイク by Tony Hoare

43 :
言語を選んだ時点で失敗が確定するというのは
時期尚早な最適化の話と内容が180度違うから困る

44 :
'こんにちはundefined'
許すまじundefined

45 :
⊥が現れるのは再帰がある場所に限定される
が評価されるタイミングは限定されない

46 :
いちおうMaybeモナドすげEEEEEEってのはわかったつもりなんだけどさ
モナド使うとなんでIOの副作用が分離されるの ?
IOってところに環境のいろんなところが入っているから
それをひきずり回しているからIOじゃないところは純粋であるって説明
どっかで読んだんだけど、具体的にはどうやってるの ?
おしえてキボンヌ

47 :
指定したN番目の値を返す関数を作りたいのですが、上手く出来ません。
例えば、nthElementIs [1,2,3,4] 3 > 3見たいにしたいです。
isTrue :: Int -> Bool
isTrue number
| number > 0= False
| otherwise= True
nthElementIs :: [a] -> Int -> a
nthElementIs list number = case (list) of
[] -> case (number) of
0 -> []
otherwise -> error"okh"
(x:[]) -> case (number) of
1 -> x
otherwise -> error"z"
(x:xs) -> case (number) of
isTrue -> error"df"
otherwise -> nthElementIs xs (number - 1)

48 :
>>46
どうやってという疑問は比較的簡単で
Stateモナドで状態を引きずり回しているのと同じように
RealWorldを引きずり回しているのが IO

49 :
無限リストなの?

50 :
>>47
よーしパパそれほどHaskellerじゃないけど調子に乗って習作書いちゃうぞー
nthElementIs :: [a] -> Int -> a
nthElementIs (x:xs) num | num == 1 = x
. | num > 1 = nthElementIs xs (num - 1)
これじゃいかんの ?
不適なデータが来ても何とかするなら
nthElementIs :: [a] -> Int -> Maybe a
nthElementIs [] _ = Nothing
nthElementIs (x:xs) num | num < 1 = Nothing
. | num == 1 = Just x
. | num > 1 = nthElementIs xs (num - 1)
とか

51 :
>>50
ありがとうございます。
コードがすっきり分かり易いです。
エラー書くよりはMaybe使った方がやはりいいのでしょうか?
後、ガードとcaseの使い分けはあるのでしょうか?
聞いてばっかですいません。

52 :
>>50はものすごく教科書的でいいね。
nthElementIs xs num = last . take num $ xs
俺ならこの質問されたらめんどくさいから一行でこう書くわ
駄目な大人になってしまった

53 :
nthElementIs xs n = xs!!(n-1)

54 :
>>53でFA
これ以外の正解はない

55 :
明らかに学習目的なのに既存の関数を使って正解って…
あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた

56 :
>>46
分離したというけど、無関係ではないよね
IOの中では関数を適用できるが、関数の中ではIOを実行できない、という関係
コールバック関数を自分でコールできないみたいな状況に似ている

57 :
既存の関数使わないでどう答えろと
(==)も(<)も(>)も(!!)も、全部既存の関数だぞ

58 :
monadだから分離されているというべきなのか。
IOの型修飾を外すには、(>>=)するしか無いから分離されているというか、、、

59 :
>>51
> エラー書くよりはMaybe使った方がやはりいいのでしょうか?
> 後、ガードとcaseの使い分けはあるのでしょうか?
すまん。自分も習いはじめでよくわからんとです。
>>52
教科書読んだばかりですから !!
一流のHaskellerになると関数合成ばしばし使うのですね。
自分、関数合成にまだ発想が行きません。
便乗質問ですが、ピリオドとダラーの使い分けなんですけど、
nthElementIs xs num = last . take num $ xs

nthElementIs xs num = last $ take num $ xs

nthElementIs xs num = last $ take num xs
も結果は同じなのですがどう使い分けてます ?
本来なら(引数の順番さ000え逆だったら、nthElementIs num xsだったら)
nthElementIs num = last . take num
って書きたかったのでしょうけど

>>55
> あとインデックスは0から開始するように習慣づけるべきだと誰も指摘しないことに驚いた
そうしなければいけない何らかの事情があるのかと思ってた
((!!)を使うといけないのもエラー処理のためとか今後の拡張とかの理由かと思ってた)

60 :
>>57
「既存の(ほぼ答えそのものの)関数を使って…」って書いたら満足だったか?
ていうか、よく見たら思った以上に酷い回答ばっかだった
まず、「is」が付く名前は慣習的にBoolを返すものだから、「nthElement」か単に「nth」とすべき。
>>52はありえない
>>50
(nthElement [] n) がNothingを返すのはいいが、
(nthElement [1,2,3,4] -1) などは明らかにプログラミングエラーなのだからエラーにするべき。
(他の言語なら最後の要素を返すのも考えられるが)
そうしないと潜在的なバグがコードに紛れ込み、かえって品質を落とすことになる。
入門書の最初の方に出てくるような例なんだから、これくらいまともに回答してくれよ

61 :
人に文句言ってばかりで自分では何もしないカスがいるみたいだから、
俺が代わりにPreludeに載ってる!!の例から丸写ししてやる。
nthElement :: [a] -> Int -> a
nthElement xs n | n < 1 = error "nthElement: negative index"
nthElement [] _ = error "nthElement: index too large"
nthElement (x:_) 1 = x
nthElement (_:xs) n = nthElement xs (n - 1)

62 :
丸写しして気づいたけど、2chでの回答としては>>53が一番の正解で間違いないね
ほぼ答えそのものの関数があるならそれを示せばいいだけだ。わざわざ転記する必要ねーじゃん

63 :
>>61
酷いと言われて悔しかったのはわかるが、実際にいちばんまともなコメントをしているのは自分だと思うぞ。
名前から「Is」を削ったのは納得したからじゃないの?
(インデックスをわざわざ1から開始にするのは意味がわからないが…)
>>62
それなら答えは(!!)を使えということだろ。
あるいはソースへのリンクを貼るか
http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.6.0.1/src/GHC-List.html#%21%21

64 :
病院池

65 :
>実際にいちばんまともなコメントをしているのは自分だと思う
実際に一番まともなコメントは>>63以外にないと思うぞ。マジで。
名前は突っ込まれたから変えたけど正直問題の本質と関係ないからどうでもいいし
>インデックスをわざわざ1から開始にするのは意味がわからない
問題読み直したら?
>それなら答えは(!!)を使えということだろ。
だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。

66 :
安価ミス。>>63じゃなくて>>53
×実際に一番まともなコメントは>>63以外にないと思うぞ。
○実際に一番まともなコメントは>>53以外にないと思うぞ。
×だからそれが>>63で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、
○だからそれが>>53で既出だって話。ぐだぐだ書いてる俺らより余程簡潔にまとめてるし、

67 :
>>62
あなたがそれを一番の正解と判断するに至った価値基準は?
それはあなた以外の人も持っていて当然のもの?
それ以外の価値基準が存在しうることは理解してる?

68 :
なんかここ怖い

69 :
基地外隔離スレだから仕方ない

70 :
>>65,66
なんでそんなに切れてるわけ?
>>47を見れば初学者なのは一目瞭然なんだから、インデックスは0から始めるものだと教えてやるのは当然だし、
どう考えても争うような本質的な問題じゃないだろ?
> ソースのリンクなんか貼らなくてもPreludeのソースなんてド素人でも見つけられる。
リンクを貼るの難しそうだしね。無理言って悪かったよ。

71 :
Haskell怖いです(震え声)

72 :
Haskellは怖くないよ
>>47とかたぶんFizzBuzz並に簡単な問題
それさえもできない人が何故か回答してるからおかしくなってるだけで

73 :
nth elementの取り出しなんて、preludeのソース詠めばいいだろ

74 :
どうみても頭がおかしいのは>>60ひとり

75 :
入門書読んだ後は、!!とか自作して遊んでたな。。。(遠い目)

76 :
プログラミングhaskell
8章まで来たけど、いよいよ全く意味がわからなくなって挫折しそうボスケテ!

77 :
8章は載ってるコードじゃ動かないし、その後の章の知識が必要だから初見で理解するのはたぶん無理だろう
理解できると一番面白い章だけど、最初は適当に読み流した方がいい

78 :
8章から難易度がスコーンと上がるからな
すごいHの方に浮気するのもアリだと思う

79 :
個人的にはすごいHaskellの方が難しいと思う
とくに序盤は

80 :
RWHで挫折してまたRWHに戻ってくるまでが勉強です

81 :
dammy

82 :
>>77
8章はPreludeのdo,returnとかが邪魔してコード通り動かないよなw
とりあえずdo表記を使わず、Preludeにある関数は名前を変えて
なんとか練習問題まで終わらせたけど・・・。
9章の電卓も期待した動きと違う。主に遅延評価のせいだと思うけど。
入力した式が評価されるまでputStrの実行も遅延させられるみたいで、
電卓のテンキー(飾り)が表示されない・・・。
俺は練習問題に関してはここで心が折れたw
本文は、10章まで読んだけど、11章からは応用問題みたいだから
後でいいやと読むのを止めたw

83 :
Haskellの最初の挫折ポイントはモナド
次の挫折ポイントが値の直接変更はSTモナド内で引きこもってやるということ
次の挫折ポイントがモナド変換

84 :
モナドって、"最初の"挫折ポイントか?
私は、まだモナド山に入山してさえいない。その前でちょっと挫折気味。
今、プログラミングHaskell 13章を読んでいる最中。
すごいHaskellはアダプティブファンクターのところで止まっている。
プログラミングHaskell を読み終わったら、すごいHaskellのアダプティブファンクター
〜モナドのところに進んでみる。

85 :
adaptive functor!

86 :
>アダプティブファンクター
挫折した感がものすごく良く伝わってくる

87 :
挫折ポイントはいっぱいある。
型クラス、型構築子、データ構築子などの独特な型の世界が
行く手を阻んでいる。
ついでに型でエラーが出まくって慣れないと
何のエラーかよくわからんのがなぁ。

88 :
走り出してからエラーになるくらいならコンパイル通らない方が正義

89 :
俺も正義だと思うが、それとエラーメッセージが分かりづらいのは別の話

90 :
コンパイラがプログラマの意図を読めない限り
ありのままに起こった事を言うしかない
何を言ってるか分からないと思うが

91 :
それとエラーメッセージが分かりづらいのは別の話

92 :
Haskell(GHC)で最も意味不明のエラー in 俺
* is a rigid type variable bound by 〜

93 :
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
deriving (Eq, Show)
fromDayToNum :: Day -> Int
fromDayToNum day = case (day) of
Mon-> 0
Tue -> 1
Wed -> 2
Thu -> 3
Fri -> 4
Sat -> 5
Sun -> 6
fromNumToDay :: Int -> Day
fromNumToDay number = case (number) of
0 -> Mon
1 -> Tue
2 -> Wed
3 -> Thu
4 -> Fri
5 -> Sat
6 -> Sun
isWorkDay :: Day -> Bool
isWorkDay day
| (fromDayToNum day >= 0 && fromDayToNum day <= 4) = True
| otherwise = False
isWorkDay' :: Day -> Bool
isWorkDay' day = case (day) of
(fromDayToNum day >= 0 && fromDayToNum day <= 4)-> True
_-> False
何故、isWorkDay' はfromDayToNumを使えないのでしょうか?

94 :
>>93
case 中の -> の左側はパターンしか書けない
関数適用はパターンではないので、そういう使い方はできない
パターンは例をたくさん見ると理解がはやいと思う
直感的には構造で分岐する

95 :
例を見るもなにも、パターンマッチには基本的にコンストラクタしか使えないってだけじゃないの?
一応例外的にリストは[]が使えるけど

96 :
基本的にリテラルも使える

97 :
[]が例外的? 意味ワカンネ

98 :
基本的にn+kは消えた

99 :
束縛した変数を使えるという思い込みがたまに発生してデバッグに時間がかかる

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
プログラム関係の雑誌について (223)
俺主催囲碁プログラミングコンテスト (574)
こんなプログラミング言語は嫌だ! (594)
魁け! Ruby 1.9.X (310)
動的言語で大規模開発 (291)
初心者の俺が初めて覚えるプログラム言語 (472)
--log9.info------------------
ももいろクローバーZ 780 (1001)
【元ぱすぽ☆候補生】palet (891)
【おがまな】 小川真奈 part3 【めちゃモテ委員長】 (853)
【しょこたん】ぼくらの中川翔子ちゃん No.125 (303)
【火10】原幹恵 Part7 【HUNTER】 (334)
【Perfume】かしゆか応援スレ266【オトナノテツカッタ♪】 (1001)
【ダーリオ】内田理央 Part2 (436)
ももいろクローバーZ 779 (1001)
【テクノポップユニット】Perfume 2523【徹子にLOCKS!】 (1001)
【一年ぶり】保田真愛【DVD発売してた】 (956)
チョリース☆木下優樹菜☆Part12【ユッキーナ】 (202)
【GANTZ】水沢奈子 part4【アバター】 (603)
さくら学院応援スレッド 1時限目 (472)
なぜブサイク本田朋子は人気ないのか? (402)
未来穂香 Part4ほののん (231)
【エロ三十路】壇蜜【秋田美人】その2 (290)
--log55.com------------------
最強のミックスボイサーを目指すスレ19
☆燃える★アニソンうpスレ★萌える★vol.65
おけ板将棋部
【声帯】 DIR EN GREY を叫びつくせ 35 【裂傷】
【ヒカリノアトリエ】Mr.Children part 56【忙しい僕ら】
アイドルソングを楽しく歌うスレ
伝説のギャグスレ主がtwitterで活動中
結局ミックスボイスってどうすればいいの