对Haskell列表理解的工作感到困惑

时间:2015-10-21 15:19:04

标签: list haskell

我是一名新程序员并使用Haskell。我找到了一行名为find的代码,它将一个String与列表中对应的对匹配。像这样

find a b = [x|(y,x) <- b, a==y]

我不完全理解这个节目的内容,对于列表理解,因为我以前从未见过x|(y,x)以这种方式使用过,我主要是看过它用作x|xx|x^2。那么,这是否意味着从输入列表A中找到字符串B = x的列表理解,其中x是一对(String, Char)来自By等于您输入的a?这里有点困惑。

3 个答案:

答案 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=2b=[(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]