質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

2回答

2075閲覧

vital.vimのData.Optionalのメリットとは?

mitsuru793

総合スコア157

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2017/05/21 08:57

vim-jp/vital.vimというvimプラグイン開発者向けのUtilライブラリがあります。
こちらにData.Optionというライブラリがあるのですが、いまいちメリット分かりません。
テストコードヘルプを見て調べていました。

ヘルプには下記の概要とサンプルコードがあります。

*Vital.Data.Optional* represents an optional value. An optional value can be a valid state (some) or invalid state (none). This is like a Maybe in Haskell, Option in Scala, std::optional in C++ and so on. An optional value is usually used as a result of process which may cause an error or as a cache of some results. Vim script doesn't have a way to treat a value which may be invalid. Goal of this library is to provide the way to treat an optional value in a good way. The implementation of optional value is a |List|. Empty list means an invalid value and 1-element list means a valid value. So, some functions for |List| like |empty()| or |map()| or |filter()| and so on are also available for an optional value.

vim

1let s:cache = O.none() 2 3function! GetData() 4 if O.exists(s:cache) 5 return O.get(s:cache) 6 endif 7 let data = DoHeavyProcess() 8 let s:cache = O.some(data) 9 return data 10end

if s:cacheでは何か問題があるのでしょうか?
どんな値でも真理値にするという目的があるのかなと思いましたが、どんな値でもtrue/falseとして解釈できるのではと思いました。

どなたか解説をして頂きたいです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんなコードが書けます 🐱

vim

1" foo#get_all_account(): 色んなサイトのアカウント情報がリストで入ってくる 2let all_account = foo#get_all_account() 3" foo#try_login_to_somewhere(): somewhereというサイトにログインし、ログインが成功したらアカウント名が返ってくる関数 4" : ログインに失敗したらO.none()を返します 5let maybe_account_name = foo#try_login_to_somewhere(choice) 6" lookup(): all_accountの中からキーがaccount_nameである要素を探してくる 7" : all_accountの中に、キーがaccount_nameである要素がなければO.none()を返します 8let maybe_account = O.bind(maybe_account_name, {account_name -> foo#lookup(all_account, account_name)}) 9" パスワード文字列に変換 10let maybe_password = O.map(maybe_account, {account -> account.password}) 11" 全ての工程がうまくいっていればパスワードを表示 12call O.map(maybe_password, {password -> execute('echo ' . password)})

これは、somewhereというサイトにログインして、それに紐付いたパスワードを表示する疑似コードです!
そして、いずれかの工程で1回でも失敗していれば何もしません。
それをif無しで表現することができます。

Data.Optionalならね!!

詳しくはScalaのOptionや、HaskellのMaybe、JavaのOptionalを参照すると、さらに多くのことが学べるかもしれません。
Optionalは特別なパラダイムを提供してくれます 😄

投稿2017/05/22 13:45

aiya000

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuru793

2017/06/01 15:19 編集

返信が遅れました???? ご回答、ありがとうございます。 `{account_name -> foo#lookup(all_account, account_name)}`というアロー関数が使えることを初めて知りました! Optionalがあるとifがなくなるということですか。NullObjectみたいですね。 Optionalがない場合は、上記の例だと引数の中身が、emptyかどうかということを毎回ifで確認する必要があるということですね。 その確認をO.mapとかがやってくれているということですか。 大変参考になりました。ありがとうございます。
guest

0

ベストアンサー

どんな値でもtrue/falseとして解釈できるのでは

できません。Vim script で真偽値として解釈できるのは、数値および数値に自動変換できる値だけです。リストや辞書、他にもジョブやチャンネルなどは、if などの真偽値を必要とする箇所に渡すとエラーになります。

投稿2017/05/22 01:52

thinca

総合スコア1864

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuru793

2017/05/22 02:47

回答、ありがとうございます。 真理値となるのが、数値および数値だから、リストなどは自動変換できなかったのですね。 boolean型があり、それらに自動変換されているのかと勘違いしていました。 リストをifを直接渡してみるとエラーになることを確認できました。(Numberへの自動変換に失敗) これでOptionalのメリットが腑に落ちました。 このライブラリ自体も勉強になります。vital.vimを開発して頂き、ありがとうございます。 使わせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問