我是一名新程序员并使用Haskell。我找到了一行名为find的代码,它将一个String与列表中对应的对匹配。像这样
find a b = [x|(y,x) <- b, a==y]
我不完全理解这个节目的内容,对于列表理解,因为我以前从未见过x|(y,x)
以这种方式使用过,我主要是看过它用作x|x
或x|x^2
。那么,这是否意味着从输入列表A
中找到字符串B
= x
的列表理解,其中x
是一对(String, Char)
来自B
,y
等于您输入的a
?这里有点困惑。
答案 0 :(得分:7)
我会说出那种理解
所有
public class FileBrowser extends ListActivity { ArrayList<String> listItems; String ROOT_PATH1 = "/storage/emulated/0"; String ROOT_PATH2 = "/storage/sdcard1"; String parent=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_browser); setRoot(); } private void setRoot() { listItems = new ArrayList<String>(); listItems.add("<-BACK"); listItems.add(ROOT_PATH1); listItems.add(ROOT_PATH2); ArrayAdapter<String> fileList = new ArrayAdapter<String>(this,R.layout.file_list_row, listItems); setListAdapter(fileList); } //on clicking any item in the dialog @Override protected void onListItemClick(ListView l, View v, int position, long id){ int selectedRow = (int)id; int y=0; if(selectedRow == 0){ setRoot(); }else { File file = new File(listItems.get(selectedRow)); if(file.isDirectory()){ getFiles(file.listFiles()); //opening pdf files }else{ //neither pdf file nor directory } } }
的列表,x
来自(y, x)
和b
。
另一种阅读方式,更顺序:
从
a == y
中提取对(y, x)
。对于每个此类对,请检查b
。如果是,请生成a == y
;否则,转到下一个。
我还应该注意,变量名有点令人困惑。 Haskell中的惯用语是给列表或其他容器复数名称。所以更像是
x
答案 1 :(得分:3)
您似乎将“x|x
”视为一种东西。相反,列表推导的工作方式如下:
[
表达式返回|
内容以迭代]
您的示例基本上是“从(x, y)
中抽取b
,丢弃任何不满足a == y
的内容,然后返回x
”。
答案 2 :(得分:2)
让我们举例说明一下:
find a b = [x|(y,x) <- b, a==y]
允许a=2
,b=[(1,3),(2,4),(3,5),(2,7)]
(y,x)
会将每个(1,3),(2,4),(3,5),(2,7)
作为一对,并检查第一个元素是否等于2
(我们说a
等于2
)。如果为True,则该函数将返回该对的第二个元素 - x
,并将其放入包含其余答案的列表中。
因此该函数的输出为[4,7]